【Go】那么多數(shù)值類型,應(yīng)該選哪個(gè)?

原文鏈接: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、 uint64uintint8、 int16、 int32int64、 int。

從類型名稱上可以很好了解到類型的大小,這個(gè)非常直觀,uintint 這兩種類型是不帶大小的,那么它們的大小會(huì)根據(jù)編譯參數(shù) GOARCH=amd64 平臺(tái)決定的。

我最早設(shè)計(jì)的一個(gè)go的項(xiàng)目,當(dāng)時(shí)設(shè)計(jì)系統(tǒng)使用采用最小類型原則,幾乎使用了大多數(shù)數(shù)值類型,很少使用 uintint 類型,后來(lái)遇到很多問(wèn)題,標(biāo)準(zhǔn)庫(kù)和三方庫(kù)函數(shù)都接收 int、 uintint64、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ù)大小選擇 int32int64、 uint32uint64。因?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)先選用 uintuint64 。
  • 只和自己的函數(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)注明出處!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容