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