首頁 >後端開發 >Golang >如何在 Go 中多次讀取 io.Reader ?

如何在 Go 中多次讀取 io.Reader ?

Patricia Arquette
Patricia Arquette原創
2024-12-18 19:36:11922瀏覽

How Can I Read from an io.Reader Multiple Times in Go?

從單一io.Reader 讀取多次

在Go 中,使用io.ReadCloser 介面從來源讀取資料可以呈現一個從來源讀取資料可以呈現一個嘗試多次閱讀時面臨挑戰。例如,考慮一個場景,您想要使用包含圖像的 request.Body(類型 io.ReadCloser)來直接寫入檔案和解碼。

問題:

嘗試建立讀取器的多個實例(如以下程式碼所示)會導致第二次呼叫傳回nil值:

package main

import (
    "io/ioutil"
    "log"
    "strings"
)


func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    a := &r
    b := &r
    log.Println(ioutil.ReadAll(*a))
    log.Println(ioutil.ReadAll(*b))

}

解決方案:

io.Reader介面模擬一個流,這意味著它不能被讀取兩次。若要克服此限制,您可以利用 io.TeeReader 函數建立重複流。

package main

import (
    "bytes"
    "io"
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)

    log.Println(ioutil.ReadAll(tee))
    log.Println(ioutil.ReadAll(&buf)) 
}

此程式碼示範如何使用 io.TeeReader 從 r 建立重複流並將內容寫入兩者三通和緩衝區。透過先從 tee 讀取,您可以確保緩衝區填充有流的內容。

以上是如何在 Go 中多次讀取 io.Reader ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn