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

Why does io.WriterTo's WriteTo method return an int64 rather than an int?

Go's io packagereturn(int, error)中的大部分输出方法,例如io.WriterWrite([]byte)方法和io.WriteString(io.Writer, string)函数.但是,一些输出方法,如io.WriterToWriteTo方法,return改为(int64, error)。这使得根据 WriteWriteString 实现 WriteTo 而不存储中间值并将其从 int 类型转换为 int64 是不方便的。造成这种差异的原因是什么?

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

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

Writer.Write()方法的签名:

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

写入的内容。引用自 spec: Slice types:

A slice is a descriptor for a contiguous segment of an underlying array...

众所周知,切片有一个底层数组。再次引用 Spec: Array types:

The length is part of the array's type; it must evaluate to a non-negative constant representable by a value of type int.

所以数组的最大长度受限于int类型的最大值(在32位的情况下是2147483647,在64位的情况下是9223372036854775807体系结构)。

所以回到Writer.Write()方法:因为它写入的是传过来的slice的内容,所以保证写入的字节数会不是int.

更合适

现在WriteTo.WriteTo()方法:

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

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

示例:BigBuffer

想象一个 BigBuffer 临时将数据写入数组或切片的实现。该实现可以管理多个数组,以便如果一个数组已满(例如达到最大整数),则在另一个数组中继续。现在如果这个BigBuffer实现了WriteTo接口,你调用这个方法把内容写入一个os.File,结果会比maxint.[=34=多]