读取的字节数和无符号数

4
作为澄清我的问题的例子,在Google Go 1.0中,在"io"包中定义了以下接口:"Reader"
type Reader interface {
    Read(p []byte) (n int, err error)
}

特别是结果参数列表(n int, err error)引起了我的兴趣。根据接口文档,字节数本质上不可能为负数:

它返回读取的字节数(0 <= n <= len(p))[...]

在C语言中,使用int的原因是使用带内值-1来表示错误条件(参见Effective Go: Multiple return values)。由于多个返回值,特殊的带内值是不必要的。
Go 1.0中存在类型uint
对于只使用正范围[0,∞)而不需要特殊带内值的值,为什么要使用int而不是uint
2个回答

5

整数的事实上的数字类型是int。这部分是因为有符号 int 溢出以一种更明显的方式。

uint 的小溢出最终看起来像一个有效值,但是 signed int 的小溢出将是负数,并在期望正整数的地方引发 panic,例如切片。

这很重要,因为通常会从 Read() 中获取 'n' 并将 'p' 切片到该长度。

例如:

n, err := a.Read(p)
p = p[:n]
processReadData(p)

1

在大多数情况下,整数的事实上的数字类型是int。例如,len(x)cap(x)返回int值,即使它们也不能为负数。在大多数情况下,返回int有助于避免不同数字类型之间的类型转换。

因此,是的,Read()可以返回uint,但这会使其稍微难以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接