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 關注
- 173 瀏覽
添加回答
舉報
0/150
提交
取消