为了账号安全,请及时绑定邮箱和手机立即绑定

如何保存,然后再次提供 io 类型的数据。读者?

如何保存,然后再次提供 io 类型的数据。读者?

Go
慕姐8265434 2022-09-26 15:14:15
我想用通过HTTP调用检索的八卦数据进行多次解析。由于我想避免对每个解析进行调用,因此我想保存此数据并重用它。我从网上得到的。获取 的类型为 。gocal 解析器需要,所以它工作。Bodyio.ReadCloserio.Reader由于我只能检索一次,我可以保存它,但后来我不知道如何充当背部(到解析器,几次以考虑不同的解析条件)Bodybody, _ := io.ReadAll(get.Body)[]byteio.Readergocal
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

如您所见,该读取器公开为 ,此读取器不可重用,因为它直接连接到底层连接*(可能是 tcp/utp/或任何其他流,如网络包下的读取器)。从连接中读取字节后,新字节将等待另一次读取。http.Response.Bodyio.Reader

实际上,为了保存响应,您需要先将其排出,并将该结果保存在变量中。

body, _ := io.ReadAll(get.Body)

为了使用 Go 编程语言多次重复使用该字节段,标准 API 提供了缓冲读取器字节。NewReader.

此缓冲区充分提供了重置([]字节)方法来重置缓冲区的状态。

字节。Reader.Reset 对于多次读取相同的字节缓冲区(无分配)非常有用。相比之下,字节。每次调用新读取器时都会进行分配。

最后,在对 的两次连续调用之间,应使用之前收集的字节缓冲区重置缓冲区。c.Parser

如:

buf := bytes.NewReader(body)

// initialize the parser

c.Parse()

// process the result


// reset the buf, parse again

buf.Reset(body)

c.Parse()

您可以尝试此版本 https://play.golang.org/p/YaVtCTZHZEP 它使用缓冲区,但接口和行为相似。strings.NewReader

  • 不是很明显,这是一般原则,传输读取标题,除非您消耗它,否则不会触及身体。另见


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号