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

原文鏈接:https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html

Go 內(nèi)置很多種數(shù)值類型,往往初學(xué)者不知道編寫程序如何選擇,使用哪種數(shù)值類型更有優(yōu)勢。

內(nèi)置的數(shù)值類型有:uint8uint16、 uint32uint64、 uintint8、 int16、 int32、 int64、 int。

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

我最早設(shè)計的一個go的項目,當(dāng)時設(shè)計系統(tǒng)使用采用最小類型原則,幾乎使用了大多數(shù)數(shù)值類型,很少使用 uintint 類型,后來遇到很多問題,標(biāo)準庫和三方庫函數(shù)都接收 intuint、 int64uint64, 一些代碼生成工具, 比如 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)先選用 uintuint64
  • 只和自己的函數(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)載請注明出處!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本教程希望以詼諧幽默,誰都能理解的方式去學(xué)習(xí)Go語言。大膽的嘗試,希望編程是一個有血有肉的事情,而不是枯燥的代碼~...
    車神大講堂閱讀 2,401評論 2 10
  • 關(guān)于 Swift 重要這個文檔所包含的準備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,634評論 1 27
  • 3. Go 數(shù)據(jù)類型及數(shù)據(jù)結(jié)構(gòu) 前面的幾節(jié)中有意無意地創(chuàng)建了很多變量,在變量聲明過程中,除非聲明過程就初始化,否則...
    PRE_ZHY閱讀 756評論 0 2
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,203評論 1 10
  • 小時候,童話是個小小的向往 如夢般的世界 便是一個童話天地 長大后,童話是種淡淡的吸引 皎月似的清輝 即為童話中的...
    林夢同學(xué)閱讀 141評論 3 3

友情鏈接更多精彩內(nèi)容