我想使用包含图像的 request.Body(type io.ReadCloser)
。
我不想使用 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
.
请帮助我如何为同一读者传递多个单独的引用?
最佳答案
io.Reader
被视为溪流。正因为如此,你不能读两遍。想象一个传入的 TCP 连接 - 你无法回滚传入的内容。
但您可以使用 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
中读取,否则缓冲区将为空。
关于go - 如何从同一个 io.Reader 读取多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39791021/