go bytes緩沖區使用介紹


緩沖區原理簡介:

  go字節緩沖區底層以字節切片做存儲,切片存在長度len與容量cap, 緩沖區寫從長度len的位置開始寫,當len>cap時,會自動擴容。緩沖區讀會從內置標記off位置開始讀(off始終記錄讀的起始位置),當off==len時,表明緩沖區已全部讀完

     並重置緩沖區(len=off=0),此外當將要內容長度+已寫的長度(即len) <= cap/2時,緩沖區前移覆蓋掉已讀的內容(off=0,len-=off),從避免緩沖區不斷擴容。

 

常用函數使用示例:

package main

import (
    "bytes"
    "fmt"
)

func main() {
    byteSlice := make([]byte, 20) 
    byteSlice[0] = 1                                  // 將緩沖區第一個字節置1
    byteBuffer := bytes.NewBuffer(byteSlice)          // 創建20字節緩沖區 len = 20 off = 0
    c, _ := byteBuffer.ReadByte()                     // off+=1
    fmt.Printf("len:%d, c=%d\n", byteBuffer.Len(), c) // len = 20 off =1   打印c=1
    byteBuffer.Reset()                                // len = 0 off = 0
    fmt.Printf("len:%d\n", byteBuffer.Len())          // 打印len=0
    byteBuffer.Write([]byte("hello byte buffer"))     // 寫緩沖區  len+=17
    fmt.Printf("len:%d\n", byteBuffer.Len())          // 打印len=17
    byteBuffer.Next(4)                                // 跳過4個字節 off+=4
    c, _ = byteBuffer.ReadByte()                      // 讀第5個字節 off+=1
    fmt.Printf("第5個字節:%d\n", c)                    // 打印:111(對應字母o)    len=17 off=5
    byteBuffer.Truncate(3)                            // 將未字節數置為3        len=off+3=8   off=5
    fmt.Printf("len:%d\n", byteBuffer.Len())          // 打印len=3為未讀字節數  上面len=8是底層切片長度
    byteBuffer.WriteByte(96)                          // len+=1=9 將y改成A
    byteBuffer.Next(3)                                // len=9 off+=3=8
    c, _ = byteBuffer.ReadByte()                      // off+=1=9    c=96
    fmt.Printf("第9個字節:%d\n", c)                    // 打印:96
}

ps:go字節緩沖區ByteBuffer只能跳過未讀的和丟棄已寫的(即未讀的),操作會有點受限,如讀已讀的就無法操作。 但可使用ByteReader讀緩沖區實現,使用該對象的seek函數。其余操作類似,簡略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM