亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中,什么時候應該使用 uint 和 int?

在 Go 中,什么時候應該使用 uint 和 int?

Go
一只名叫tom的貓 2022-06-21 10:06:37
乍一看,當您需要一個不想成為負數的 int 時,似乎有人可能會選擇 uint。然而,在實踐中,似乎 int 幾乎總是首選。我看到一般建議,例如:“一般來說,如果你使用整數,你應該只使用 int 類型?!薄皍int 通常只用于進行二元運算”“不要使用無符號類型來強制或建議數字必須是正數。這不是它們的用途?!薄斑@是 Go 編程語言所推薦的,當你想要進行按位運算時,uint 的具體示例很有用”我還注意到 Go 會讓你將負 int 轉換為 uint 并給出一些奇怪的結果:  x := -5     y := uint(x)     fmt.Println(y)     >> 18446744073709551611所以,我的理解是,在處理整數時,我應該始終使用 int,而不管符號如何,除非我發現自己需要 uint,并且在這種情況下我會知道(我認為???)。我的問題:這是正確的外賣嗎?如果是這樣,為什么會這樣?什么時候應該使用 uint 的例子是什么?- 也許是一個具體的例子,而不是“進行二進制操作時”,因為我不確定我知道這意味著什么:)另外,我問的是 Go 的具體實現。
查看完整描述

2 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

此答案適用于 C,但與此處相關。

通常,如果您使用整數,則應該只使用該int類型。

通常建議這樣做,因為我們“通?!庇龅降拇蠖鄶荡a都處理 type int。您通常也不需要在使用 anintuinttype 之間進行選擇。

不要使用無符號類型來強制或建議數字必須為正數。那不是他們的目的。

這是相當主觀的。您可以很好地使用它來保持您的程序和數據類型安全,并且不必為處理由于負整數情況而出現的偶然錯誤而煩惱。

“這是 Go 編程語言所推薦的,當你想要進行按位運算時,uint 的具體示例很有用”

這看起來很模糊。請為此添加來源,我想閱讀它。

x := -5

y := uint(x)

fmt.Println(y)


>> 18446744073709551611

這是許多語言的典型特征。這背后的邏輯是,當您將int類型轉換為 auint時,用于 的二進制表示會被int塞入uint類型中。最后,一切都只是二進制的抽象。例如,看看這段代碼和它的輸出:


a := int64(-123)

byteSliceRev := *(*[8]byte)(unsafe.Pointer(&a))      // The byte slice representation we get is LTR in increasing order of significance

u := uint(a)

byteSliceRevU := *(*[8]byte)(unsafe.Pointer(&u))

byteSlice, byteSliceU := make([]byte, 8), make([]byte, 8)

for i := 0; i < 8; i++ {

    byteSlice[i], byteSliceU[i] = byteSliceRev[7-i], byteSliceRevU[7-i]

}

fmt.Println(u)

// 18446744073709551493

fmt.Printf("%b\n", byteSlice)

// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]

fmt.Printf("%b\n", byteSliceU)

// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]

-5int64類型的字節表示與18446744073709551493類型相同。uint


所以,我的理解是,在處理整數時,我應該始終使用 int,而不管符號如何,除非我發現自己需要 uint,并且在這種情況下我會知道(我認為???)。


但這對于“我們”編寫的每一個代碼來說不是或多或少都是真的嗎?!


這是正確的外賣嗎?如果是這樣,為什么會這樣?


我希望我已經回答了這兩個問題。如果您仍有任何疑問,請隨時問我。


什么時候應該使用 uint 的例子是什么?- 也許是一個具體的例子,而不是“進行二進制操作時”,因為我不確定我知道這意味著什么:)


想象一個場景,您的數據庫中有一個表,其中有很多條目,其中 an 的整數id始終為正數。如果您將此數據存儲為int每個條目的一個位實際上是無用的,并且當您擴展它時,當您可以使用uint并保存它時,您將失去很多空間。在傳輸數據時可以考慮類似的情況,準確地說是傳輸大量整數。此外,uint由于額外的位,與對應的有符號整數相比,正整數的范圍翻了一番,因此用完 numbers需要更長的時間。存儲現在很便宜,所以人們通常會忽略這個所謂的小收益。


另一個用例是類型安全。Auint永遠不會是負數,所以如果你的代碼的一部分對負數很敏感,它可以證明是非常方便的。最好在將資源浪費在數據上之前得到錯誤,以發現它是不允許的,因為它是負面的。


查看完整回答
反對 回復 2022-06-21
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

Package Image 使用 uint 和 crypto/tls,所以當你使用這些包時你必須使用 uint。

我一開始是合乎邏輯地使用它,但我不會為此而爭吵,如果它成為一個問題,我會使用一種實用的方法。

就像為什么將 int 用于 len()


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 1197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號