Mat*_*att 6 io standard-library go output
大部分的输出方法Go的io
包的回报(int, error)
,例如io.Writer
的Write([]byte)
方法和io.WriteString(io.Writer, string)
功能.然而,少数的输出方法,如io.WriterTo
的WriteTo
方法,返回(int64, error)
来代替.这使得不方便实现WriteTo
在以下方面Write
或WriteString
不存储的中间值,并输入从将其转换int
到int64
.造成这种差异的原因是什么?
WriteTo
复制可能超过int32字节的数据.
使用io.Reader
和io.Writer
接口,数据量受给定切片的大小限制,其长度受int
当前体系结构的限制.
Writer.Write()
方法签名:
Write(p []byte) (n int, err error)
Run Code Online (Sandbox Code Playgroud)
它写入slice的内容。引用规范:切片类型:
切片是底层数组的连续段的描述符......
众所周知,切片有一个底层数组。再次引用规范:数组类型:
长度是数组类型的一部分;它必须评估为可由 type 值表示的非负常量
int
。
因此数组的最大长度受int
类型最大值的限制(2147483647
在 32 位和9223372036854775807
64 位架构的情况下)。
所以回到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
。
归档时间: |
|
查看次数: |
450 次 |
最近记录: |