原文鏈接:https://blog.thinkeridea.com/...
Go
內置很多種數值類型,往往初學者不知道編寫程序如何選擇,使用哪種數值類型更有優勢。
內置的數值類型有:uint8
、 uint16
、 uint32
、 uint64
、 uint
、 int8
、 int16
、 int32
、 int64
、 int
。
從類型名稱上可以很好瞭解到類型的大小,這個非常直觀,uint
和 int
這兩種類型是不帶大小的,那麼它們的大小會根據編譯參數 GOARCH=amd64
平臺決定的。
我最早設計的一個go的項目,當時設計系統使用採用最小類型原則,幾乎使用了大多數數值類型,很少使用 uint
和 int
類型,後來遇到很多問題,標準庫和三方庫函數都接收 int
、 uint
、 int64
、uint64
, 一些代碼生成工具, 比如 protobuf
生成類型是 int32
,一些三方系統大多數也是 int
類型,這時候與其它組件件的交互就需要 <span style="color:red">類型轉換</span>, 類型轉換成本是很高的,導致程序性能並沒有預期的好。
上面一個小故事(事故)警醒大家不要一味的根據數據的大小選擇數值類型,而要考慮數值的用來做什麼,後面會有哪些交互,需要調用哪些函數等等,是不是選擇數值具體使用什麼類型很複雜呢?並不是這樣,考慮的越少,選擇越簡單,下面有一些近些年的總結。
- 需要原子操作的數值根據數據大小選擇
int32
、int64
、uint32
、uint64
。因爲原子類型的操作包天生支持這些類型。 - 需要與代碼生成的交互的數據,可以看生成的代碼具體使用哪種類型,做一下參考。
- 需要調用大多數標準庫函數進行處理,選這個
int
(我們的程序大多數跑在64位系統上,如果運行在32系統,且類型可能會超過int32
可以選擇int64
) 。 - 有些時候可能我們需要一個無符號數據且比較大優先選用
uint
和uint64
。 - 只和自己的函數交互以及一些不關注具體類型的包(
json
、fmt
)交互式時,按數值使用範圍選擇最小類型。
我現在寫代碼一些特殊場景如原子操作會針對使用的包選擇具體類型,偶爾會使用uint64
,往往是一些按位做一些複雜計算的數據,也都侷限在局部邏輯上,與其它模塊或者系統交互的都會使用 int
類型,這樣可以大幅度降低數值類型的類型轉換問題,從而從空間換取時間,獲得更好的程序性能。
不得不說說 Go
語言神奇的 int
類型,爲什麼需要這樣一個編程是無法確定具體長度的類型呢,而需要在編譯時確定呢,有什麼好處呢。
往往我們寫程序是不太關注數值類型的,或者說我們程序中很多數值不會超過 int32
的最大值(往往我們的程序運行在 32 或 64位平臺上),這個時候很多三方庫都可以使用 int
作爲交互類型,不用把一個函數爲每種類型數值都寫一遍,能簡化標準庫。我們也能寫出更容易維護、簡潔的系統。
轉載:
本文作者: 戚銀(thinkeridea)
本文鏈接: https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 CN協議 許可協議。轉載請註明出處!