作为澄清我的问题的示例,在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,∞)且不需要具有特殊带内值的值的情况下,使用int
与uint
的具体原因是什么?
答案 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
,但这会让它更难以使用。