緩沖區原理簡介:
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函數。其余操作類似,簡略。