【Go】那麼多數值型別,應該選哪個?
原文連結:https://blog.thinkeridea.com/...
Go
內建很多種數值型別,往往初學者不知道編寫程式如何選擇,使用哪種數值型別更有優勢。
內建的數值型別有:uint8
、 uint16
、 uint32
、 uint64
、 uint
、 int8
、 int16
、 int32
、 int64
、 int
。
從型別名稱上可以很好了解到型別的大小,這個非常直觀,uint
和 int
這兩種型別是不帶大小的,那麼它們的大小會根據編譯引數 GOARCH=amd64
平臺決定的。
我最早設計的一個 go 的專案,當時設計系統使用採用最小型別原則,幾乎使用了大多數數值型別,很少使用 uint
和 int
型別,後來遇到很多問題,標準庫和三方庫函式都接收 int
、 uint
、 int64
、uint64
, 一些程式碼生成工具, 比如 protobuf
生成型別是 int32
,一些三方系統大多數也是 int
型別,這時候與其它元件件的互動就需要 <span>型別轉換</span>, 型別轉換成本是很高的,導致程式效能並沒有預期的好。
上面一個小故事 (事故) 警醒大家不要一味的根據資料的大小選擇數值型別,而要考慮數值的用來做什麼,後面會有哪些互動,需要呼叫哪些函式等等,是不是選擇數值具體使用什麼型別很複雜呢?並不是這樣,考慮的越少,選擇越簡單,下面有一些近些年的總結。
- 需要原子操作的數值根據資料大小選擇
int32
、int64
、uint32
、uint64
。因為原子型別的操作包天生支援這些型別。 - 需要與程式碼生成的互動的資料,可以看生成的程式碼具體使用哪種型別,做一下參考。
- 需要呼叫大多數標準庫函式進行處理,選這個
int
(我們的程式大多數跑在 64 位系統上,如果執行在 32 系統,且型別可能會超過int32
可以選擇int64
) 。 - 有些時候可能我們需要一個無符號資料且比較大優先選用
uint
和uint64
。 - 只和自己的函式互動以及一些不關注具體型別的包 (
json
、fmt
) 互動式時,按數值使用範圍選擇最小型別。
我現在寫程式碼一些特殊場景如原子操作會針對使用的包選擇具體型別,偶爾會使用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 協議 許可協議。轉載請註明出處!
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- SSL數字證書應該選哪種?這三種型別哪種適合你!型別
- 代理應該怎麼選?代理型別先弄清型別
- mysql中數值型資料有哪兩個類別?MySql
- 開源軟體那麼多,我們該如何選擇?
- Java 與 Python:你應該選擇哪個?JavaPython
- web自動化測試工具那麼多,教你到底該怎麼選Web
- TypeScript 數值型別TypeScript型別
- 大學學計算機應該選哪個專業呢?計算機
- Go Quiz: 從Go面試題看數值型別的自動推導GoUI面試題型別
- int型別是無法通過&獲取地址的,那物件裡的*int應該如何賦值型別物件賦值
- 多型中的返回值型別多型型別
- JavaScript - 變數、值、型別JavaScript變數型別
- Python數值型別Python型別
- 結構struct(值型別)在實際應用中應該注意的點Struct型別
- 【MySQL資料型別1之--數值型別】MySql資料型別
- Python和Java該如何選擇?選哪個好?PythonJava
- oracle數值型別漫談Oracle型別
- C#變數型別(1):引用型別和值型別 (轉)變數型別
- JS開發者應懂的33個概念系列2&&3--原始型別 && 值型別和引用型別JS型別
- 程式設計書說的 “Go 程式設計師應該讓聚合型別的零值也具有意義” 是在講什麼Go程式設計師型別
- css選擇器有哪幾種型別CSS型別
- Go 函式多返回值錯誤處理與error 型別介紹Go函式Error型別
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- MYSQL 資料型別儲存-數值型MySQL 資料型別
- javascript值型別是什麼JavaScript型別
- 當下應該學習Python哪個版本?哪個方向好?Python
- Go中多個返回值的技巧Go
- JavaScript 字串轉換數值型別JavaScript字串型別
- XSD 數值資料型別資料型別
- char型別的數值轉換型別
- SUSE和Ubuntu,Linux版本該選擇哪個?UbuntuLinux
- 5 種微服務閘道器,該選哪個?微服務
- 你知道Python基本資料型別是哪6個麼Python資料型別
- 你應該使用哪個雲資料庫?資料庫
- Linux系統把時間型別值轉換為數值型的方法是什麼?Linux型別
- 圖片識別軟體選哪個?
- mybatis sql String>Double, 型別引數被強轉為數值型別MyBatisSQL型別
- 這麼多程式語言,初學者選擇哪個比較好?