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

如何从 io.Reader 多次读取?

Barbara Streisand
发布: 2024-12-16 14:26:18
原创
333 人浏览过

How to Read from an io.Reader Multiple Times?

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

使用 io.Reader 时,例如 request.Body,其中包含图像等数据,您可能会遇到需要多次访问该内容的情况。但是,使用 ioutil.ReadAll() 会消耗整个内容,导致后续读取变得不可能。

挑战

尝试创建多个读取器实例,如图所示在下面的代码中,第二次调用的结果为 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))
}
登录后复制

解决方案: TeeReader

要多次从同一个 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))
}
登录后复制

示例:

在上面的示例中,首先,您创建一个 TeeReader 来读取来自原始阅读器和缓冲区。然后,您从 TeeReader 和缓冲区读取两次以获得相同的内容。

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

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