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