读取的字节数和无符号数

时间:2012-06-04 23:48:58

标签: io range go unsigned

作为澄清我的问题的示例,在Google Go 1.0中,"io" package中定义了以下界面:

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中存在type uint

在仅使用正范围[0,∞)且不需要具有特殊带内值的值的情况下,使用intuint的具体原因是什么?

2 个答案:

答案 0 :(得分:5)

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

这很重要,因为你通常会将Read()和'p'切换为'n'到那个长度。

例如。

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

答案 1 :(得分:1)

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

所以是的,Read()本可以返回uint,但这会让它更难以使用。