go界面中也有一些类似的设计。例如,读写的结果只能是 values >= 0。为什么不只使用unsigned int类型?使用有符号类型的目的是什么?// The Copy function uses ReaderFrom if available.type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error)}// The Copy function uses WriterTo if available.type WriterTo interface { WriteTo(w Writer) (n int64, err error)}
1 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
我在Go Programming Language (A. Donovan, B. Kernighan)一书中找到了一个很好的解释:
尽管 Go 提供了无符号数和算术,但我们倾向于使用有符号int形式,即使对于不能为负数的量,例如数组的长度,尽管uint这似乎是一个更明显的选择。事实上,内置len函数会返回一个 signed int,就像在这个循环中以相反的顺序宣布奖牌一样:
medals := []string{"gold", "silver", "bronze"}
for i := len(medals) - 1; i >= 0; i-- {
fmt.Println(medals[i]) // "bronze", "silver", "gold"
}
另一种选择将是灾难性的。如果len返回一个无符号数,那么i也将是 a uint,并且根据定义,条件i >= 0 将始终为真。在第三次迭代(其中)之后i == 0,该i--语句将导致i变为不是-1,而是最大值uint,并且medals[i]通过尝试访问切片边界之外的元素,计算会在运行时失败或恐慌。出于这个原因,无符号数倾向于仅在需要其位运算符或特殊算术运算符时使用,例如在实现位集、解析二进制文件时。
- 1 回答
- 0 关注
- 190 浏览
添加回答
举报
0/150
提交
取消
