4

作为澄清我的问题的示例,在 Google Go 1.0 中,“io”包中定义了以下接口:

type Reader interface {
    Read(p []byte) (n int, err error)
}

尤其是结果参数列表(n int, err error)让我很感兴趣。根据接口的文档,本质上字节数不能为负数:

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

在 C 中,使用的原因int是带内值-1表示错误条件(请参阅有效 Go:多个返回值)。由于有多个返回值,因此不需要特殊的带内值。

Go 1.0 中存在类型uint

在仅使用正范围 [0,∞) 而无需具有特殊带内值的值的情况下,使用intvs的具体原因是什么?uint

4

2 回答 2

5

整数的实际数字类型是 int。这部分是因为 signed int 以更明显的方式溢出。uint 的小溢出最终看起来像一个有效值,但是有符号 int 的小溢出将是负数,并且在需要正整数的地方出现恐慌,例如。切片。

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

例如。

n, err := a.Read(p)
p = p[:n]
processReadData(p)
于 2012-06-05T00:56:43.513 回答
1

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

所以是的,本Read()可以返回 a uint,但这会使使用起来更加笨拙。

于 2012-06-04T23:59:28.587 回答