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

Mat*_*att 6 io standard-library go output

大部分的输出方法Go的io的回报(int, error),例如io.WriterWrite([]byte)方法和io.WriteString(io.Writer, string)功能.然而,少数的输出方法,如io.WriterToWriteTo方法,返回(int64, error)来代替.这使得不方便实现WriteTo在以下方面WriteWriteString不存储的中间值,并输入从将其转换intint64.造成这种差异的原因是什么?

Jim*_*imB 6

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

使用io.Readerio.Writer接口,数据量受给定切片的大小限制,其长度受int当前体系结构的限制.

  • @Matt:因为在适当的数据类型的任何地方都返回一个`int`,而不是将所有内容都转换为`int64`,以减少在某些系统上可能出现的情况.Read和Write的值以切片的长度表示,通常用于索引切片.另外一种方式还有很多转换. (2认同)

icz*_*cza 5

Writer.Write()方法签名:

Write(p []byte) (n int, err error)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

现在WriteTo.WriteTo()方法:

WriteTo(w Writer) (n int64, err error)
Run Code Online (Sandbox Code Playgroud)

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

例子: BigBuffer

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