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

时间:2015-04-15 19:16:40

标签: go io output standard-library

Go's io package中的大部分输出方法都会返回(int, error),例如io.Writer&#39} Write([]byte)方法和io.WriteString(io.Writer, string)函数。但是,一些输出方法(例如io.WriterTo&n; WriteTo方法)会返回(int64, error)。这使得在WriteToWrite方面实施WriteString而不存储中间值并将其从int转换为int64类型变得不方便。造成这种差异的原因是什么?

2 个答案:

答案 0 :(得分:6)

WriteTo可能比int32字节的数据复制更多。

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

答案 1 :(得分:4)

Writer.Write()方法的签名:

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

它写入切片的内容。引自spec: Slice types

  

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

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

  

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

因此,数组的最大长度受int类型的最大值限制(在32位的情况下为2147483647,在64位体系结构的情况下为9223372036854775807

回到Writer.Write()方法:因为它写了传递的片的内容,所以保证,写入的字节数是什么更适合int

现在WriteTo.WriteTo()方法:

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

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

示例:BigBuffer

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