为什么 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.Writer
的Write([]byte)
方法和io.WriteString(io.Writer, string)
函数.但是,一些输出方法,如io.WriterTo
的WriteTo
方法,return改为(int64, error)
。这使得根据 Write
或 WriteString
实现 WriteTo
而不存储中间值并将其从 int
类型转换为 int64
是不方便的。造成这种差异的原因是什么?
可能 WriteTo
复制了超过 int32 字节的数据。
使用 io.Reader
和 io.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=多]
Go's io
packagereturn(int, error)
中的大部分输出方法,例如io.Writer
的Write([]byte)
方法和io.WriteString(io.Writer, string)
函数.但是,一些输出方法,如io.WriterTo
的WriteTo
方法,return改为(int64, error)
。这使得根据 Write
或 WriteString
实现 WriteTo
而不存储中间值并将其从 int
类型转换为 int64
是不方便的。造成这种差异的原因是什么?
可能 WriteTo
复制了超过 int32 字节的数据。
使用 io.Reader
和 io.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=多]