gpt4 book ai didi

go - 为什么 io.reader 读取后会变空?

转载 作者:行者123 更新时间:2023-12-02 14:50:34 26 4
gpt4 key购买 nike

func foo(buf *bytes.Buffer) {
fmt.Println("0: ", len(buf.Bytes()))
ioutil.ReadAll(buf)
fmt.Println("1: ", len(buf.Bytes()))
}

代码第一次显示正确的长度,但第二次显示长度为零。

最佳答案

bytes.Buffer读取耗尽或消耗已读取的字节。这意味着如果您尝试再次阅读,这些内容将不会被返回。

Buffer.Bytes()返回缓冲区的未读部分,因此在读取所有内容后,您会看到0长度(这正是 ioutil.ReadAll() 所做的)。

<小时/>

如果您只想“查看”而不是真正“读取”字节怎么办?

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)

输出(在 Go Playground 上尝试):

Len: 5, Content: Hello

Peeking...
Peeked: Hell
Len: 5, Content: Hello

Reading...
Read: Hello
Len: 0, Content:

关于go - 为什么 io.reader 读取后会变空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30910487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com