從單一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中文網其他相關文章!