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