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

标签 go reader

我想使用包含图像的 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/

相关文章:

java - 可重用的 Java StringReader

java - 读取器/写入器/流何时被标识为开放?

go - 在 GoLang 中生成 CosmosDB 身份验证 token

go - 在 select 语句中使用 Reader 接口(interface)时的约定

logging - 是否可以修改其他包中定义的类型的方法集?

go - 从内部进入外部结构

c# - while(reader.Read()) {} 中列表中的重复值

java - 使用继承读取 Json

go - 如何在 GORM 中进行多表连接

go - 错误reflect.ValueOf(val).IsZero未定义(类型reflect.Value没有字段或方法IsZero