我想使用request.Body(type io.ReadCloser)其中包含图像。
request.Body(type io.ReadCloser)
我不想使用,ioutil.ReadAll()因为我想将此主体直接写入文件并希望对其进行解码,所以我只想使用对内容的引用来传递给进一步的函数调用,
ioutil.ReadAll()
我尝试创建读取器的多个实例,如下所示
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)) }
但是在第二次通话中它总是导致nil。
nil
请帮助我如何为同一读者传递多个单独的参考?
io.Reader被视为流。因此,您无法阅读两次。想象一下传入的TCP连接。您无法倒带进来的内容。
io.Reader
但是您可以使用io.TeeReader复制流:
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)) }
Go Playground上的示例
编辑: 正如@mrclx指出的:您需要从第TeeReader一个读取,否则缓冲区将为空。
TeeReader