首页 > 后端开发 > Golang > 如何在 Go 中多次读取 io.Reader ?

如何在 Go 中多次读取 io.Reader ?

Patricia Arquette
发布: 2024-12-18 19:36:11
原创
922 人浏览过

How Can I Read from an io.Reader Multiple Times in Go?

从单个 io.Reader 读取多次

在 Go 中,使用 io.ReadCloser 接口从源读取数据可以呈现一个尝试多次阅读时面临挑战。例如,考虑一个场景,您想要使用包含图像的 request.Body(类型 io.ReadCloser)来直接写入文件和解码。

问题:

尝试创建读取器的多个实例(如以下代码所示)会导致第二次调用返回 nil值:

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))

}
登录后复制

解决方案:

io.Reader 接口模拟一个流,这意味着它不能被读取两次。要克服此限制,您可以利用 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)) 
}
登录后复制

此代码演示了如何使用 io.TeeReader 从 r 创建重复流并将内容写入两者三通和缓冲区。通过首先从 tee 读取,您可以确保缓冲区填充有流的内容。

以上是如何在 Go 中多次读取 io.Reader ?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板