从单个 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中文网其他相关文章!