簡體   English   中英

為什么io.reader在讀完后會變空?

[英]Why does an io.reader become empty after reading it?

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 最簡單的方法是獲取緩沖區的字節,並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: 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM