Go 學習筆記之 常量資料型別

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

常量表達式的值在編譯期計算,而不是在執行期。每種常量的潛在型別都是基礎型別:boolean、string 或數字。

一個常量的宣告語句定義了常量的名字,和變數的宣告語法類似,常量的值不可修改,這樣可以防止在執行期被意外或惡意的修改。例如,常量比變數更適合用於表達像π之類的數學常數,因為它們的值不會發生變化:

const pi = 3.14159 // approximately; math.Pi is a better approximation

和變數宣告一樣,可以批量宣告多個常量;這比較適合宣告一組相關的常量:

const (
    e  = 2.71828182845904523536028747135266249775724709369995957496696763
    pi = 3.14159265358979323846264338327950288419716939937510582097494459
)

所有常量的運算都可以在編譯期完成,這樣可以減少執行時的工作,也方便其他編譯優化。

iota 常量生成器

常量宣告可以使用 iota 常量生成器初始化,它用於生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表示式。在一個 const 宣告語句中,在第一個宣告的常量所在的行,iota 將會被置為 0,然後在每一個有常量宣告的行加一。

type Weekday intconst (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

它首先定義了一個 Weekday 命名型別,然後為一週的每天定義了一個常量,從週日 0 開始。在其它程式語言中,這種型別一般被稱為列舉型別。

週日將對應 0,週一為 1,如此等等。

無型別常量

雖然一個常量可以有任意一個確定的基礎型別,例如 int 或 float64,或者是類似 time.Duration 這樣命名的基礎型別,但是許多常量並沒有一個明確的基礎型別。編譯器為這些沒有明確基礎型別的數字常量提供比基礎型別更高精度的算術運算;你可以認為至少有 256bit 的運算精度。這裡有六種未明確型別的常量型別,分別是無型別的布林型、無型別的整數、無型別的字元、無型別的浮點數、無型別的複數、無型別的字串。

通過延遲明確常量的具體型別,無型別的常量不僅可以提供更高的運算精度,而且可以直接用於更多的表示式而不需要顯式的型別轉換。

fmt.Println(YiB/ZiB) // "1024"

另一個例子,math.Pi 無型別的浮點數常量,可以直接用於任意需要浮點數或複數的地方:

var x float32 = math.Pi
var y float64 = math.Pi
var z complex128 = math.Pi

- END -

作者:架構精進之路,十年研發風雨路,大廠架構師,CSDN 部落格專家,專注架構技術沉澱學習及分享,職業與認知升級,堅持分享接地氣兒的乾貨文章,期待與你一起成長。
關注並私信我回復“01”,送你一份程式設計師成長進階大禮包,歡迎勾搭。

Thanks for reading!