如何从同一个 io.Reader 多次读取
使用 io.Reader 时,例如 request.Body,其中包含图像等数据,您可能会遇到需要多次访问该内容的情况。但是,使用 ioutil.ReadAll() 会消耗整个内容,导致后续读取变得不可能。
挑战
尝试创建多个读取器实例,如图所示在下面的代码中,第二次调用的结果为 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)) }
解决方案: TeeReader
要多次从同一个 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)) }
示例:
在上面的示例中,首先,您创建一个 TeeReader 来读取来自原始阅读器和缓冲区。然后,您从 TeeReader 和缓冲区读取两次以获得相同的内容。
以上是如何从 io.Reader 多次读取?的详细内容。更多信息请关注PHP中文网其他相关文章!