【Go】那麼多數值型別,應該選哪個?

qiyin發表於2019-03-19

原文連結:https://blog.thinkeridea.com/...

Go 內建很多種數值型別,往往初學者不知道編寫程式如何選擇,使用哪種數值型別更有優勢。

內建的數值型別有:uint8、 uint16、 uint32、 uint64、 uint、 int8、 int16、 int32、 int64、 int

從型別名稱上可以很好了解到型別的大小,這個非常直觀,uint 和 int 這兩種型別是不帶大小的,那麼它們的大小會根據編譯引數 GOARCH=amd64 平臺決定的。

我最早設計的一個 go 的專案,當時設計系統使用採用最小型別原則,幾乎使用了大多數數值型別,很少使用 uint 和 int 型別,後來遇到很多問題,標準庫和三方庫函式都接收 int、 uint、 int64uint64, 一些程式碼生成工具, 比如 protobuf 生成型別是 int32,一些三方系統大多數也是 int 型別,這時候與其它元件件的互動就需要 <span>型別轉換</span>, 型別轉換成本是很高的,導致程式效能並沒有預期的好。

上面一個小故事 (事故) 警醒大家不要一味的根據資料的大小選擇數值型別,而要考慮數值的用來做什麼,後面會有哪些互動,需要呼叫哪些函式等等,是不是選擇數值具體使用什麼型別很複雜呢?並不是這樣,考慮的越少,選擇越簡單,下面有一些近些年的總結。

  • 需要原子操作的數值根據資料大小選擇 int32、 int64、 uint32uint64。因為原子型別的操作包天生支援這些型別。
  • 需要與程式碼生成的互動的資料,可以看生成的程式碼具體使用哪種型別,做一下參考。
  • 需要呼叫大多數標準庫函式進行處理,選這個 int (我們的程式大多數跑在 64 位系統上,如果執行在 32 系統,且型別可能會超過 int32 可以選擇 int64) 。
  • 有些時候可能我們需要一個無符號資料且比較大優先選用 uint 和 uint64 。
  • 只和自己的函式互動以及一些不關注具體型別的包 (jsonfmt) 互動式時,按數值使用範圍選擇最小型別。

我現在寫程式碼一些特殊場景如原子操作會針對使用的包選擇具體型別,偶爾會使用uint64,往往是一些按位做一些複雜計算的資料,也都侷限在區域性邏輯上,與其它模組或者系統互動的都會使用 int 型別,這樣可以大幅度降低數值型別的型別轉換問題,從而從空間換取時間,獲得更好的程式效能。

不得不說說 Go 語言神奇的 int 型別,為什麼需要這樣一個程式設計是無法確定具體長度的型別呢,而需要在編譯時確定呢,有什麼好處呢。

往往我們寫程式是不太關注數值型別的,或者說我們程式中很多數值不會超過 int32 的最大值(往往我們的程式執行在 32 或 64 位平臺上),這個時候很多三方庫都可以使用 int 作為互動型別,不用把一個函式為每種型別數值都寫一遍,能簡化標準庫。我們也能寫出更容易維護、簡潔的系統。

轉載:

本文作者: 戚銀(thinkeridea

本文連結: https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html

版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY 4.0 CN 協議 許可協議。轉載請註明出處!

更多原創文章乾貨分享,請關注公眾號
  • 【Go】那麼多數值型別,應該選哪個?
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章