小编典典

如何从同一io.Reader读取多次

go

我想使用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

请帮助我如何为同一读者传递多个单独的参考?


阅读 416

收藏
2020-07-02

共1个答案

小编典典

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一个读取,否则缓冲区将为空。

2020-07-02