func foo(buf *bytes.Buffer) {
fmt.Println("0: ", len(buf.Bytes()))
ioutil.ReadAll(buf)
fmt.Println("1: ", len(buf.Bytes()))
}
首次运行代码会打印正确的长度,但第二次打印长度为零。
答案 0 :(得分:8)
从bytes.Buffer
排水管读取或消耗读取的字节。这意味着如果您再次尝试阅读,则不会返回。
Buffer.Bytes()
会返回缓冲区的未读部分,因此在阅读完所有内容后,您可以看到0
长度的预期结果(这正是{ {3}}确实如此。
如果你只想“偷看”而不是真正“读”字节怎么办?
bytes.Buffer
中没有“偷看”功能。最简单的方法是获取缓冲区的字节,然后从中构造另一个bytes.Buffer
并从新缓冲区中读取。
看起来像这样:
func peek(buf *bytes.Buffer, b []byte) (int, error) {
buf2 := bytes.NewBuffer(buf.Bytes())
return buf2.Read(b)
}
peek()
正在行动:为简单起见省略了错误检查:
buf := &bytes.Buffer{}
buf.WriteString("Hello")
fmt.Printf("Len: %d, Content: %s\n", buf.Len(), buf)
fmt.Println("\nPeeking...")
data := make([]byte, 4)
peek(buf, data)
fmt.Printf("Peeked: %s\n", data)
fmt.Printf("Len: %d, Content: %s\n", buf.Len(), buf)
fmt.Println("\nReading...")
data = make([]byte, buf.Len())
buf.Read(data)
fmt.Printf("Read: %s\n", data)
fmt.Printf("Len: %d, Content: %s\n", buf.Len(), buf)
输出(在ioutil.ReadAll()
上尝试):
Len: 5, Content: Hello
Peeking...
Peeked: Hell
Len: 5, Content: Hello
Reading...
Read: Hello
Len: 0, Content: