为什么不用 uint32 而不是 int64?

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)

}


慕容森
浏览 191回答 1
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]通过尝试访问切片边界之外的元素,计算会在运行时失败或恐慌。出于这个原因,无符号数倾向于仅在需要其位运算符或特殊算术运算符时使用,例如在实现位集、解析二进制文件时。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go