登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-11 16:12:52 501浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《如何从同一个 io.Reader 读取多次》,这篇文章主要会讲到golang等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我想使用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,否则缓冲区将为空。

以上就是《如何从同一个 io.Reader 读取多次》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表