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

为什么 io.WriterTo 的 WriteTo 方法返回 int64 而不是 int?

为什么 io.WriterTo 的 WriteTo 方法返回 int64 而不是 int?

Go
冉冉说 2021-09-27 21:13:54
Go 的io包中的大多数输出方法都返回(int, error),例如io.Writer的Write([]byte)方法和io.WriteString(io.Writer, string)函数。但是,一些输出方法,例如io.WriterTo的WriteTo方法,(int64, error)反而返回。这使得不方便实现WriteTo在以下方面Write或WriteString不存储的中间值,并输入从将其转换int到int64。这种差异的原因是什么?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

有可能WriteTo复制超过 int32 字节的数据。

使用io.Readerio.Writer接口,数据量受到给定切片大小的限制,int对于当前架构,切片的长度限制为 。


查看完整回答
反对 回复 2021-09-27
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

Writer.Write()方法签名:

Write(p []byte) (n int, err error)

它写入slice的内容。引用规范:切片类型

切片是底层数组的连续段的描述符......

众所周知,切片有一个底层数组。再次引用规范:数组类型

长度是数组类型的一部分;它必须计算为可由 type 值表示的非负常量int

因此数组的最大长度受int类型最大值的限制(2147483647在 32 位和922337203685477580764 位架构的情况下)。

所以回到Writer.Write()方法:由于它写入传递的切片的内容,因此可以保证写入的字节数不会超过int.

现在WriteTo.WriteTo()方法:

WriteTo(w Writer) (n int64, err error)

没有提到切片或数组。您无法保证结果将适合int,因此int64不仅仅是合理的。

例子: BigBuffer

想象一个BigBuffer临时将数据写入数组或切片的实现。该实现可以管理多个数组,以便如果一个数组已满(例如达到最大整数),则继续另一个数组。现在,如果 thisBigBuffer实现了WriteTo接口并且您调用此方法将内容写入 an os.File,则结果将大于 max int


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信