Go語言的常量

Go語言的常量是一種表達式,常量可以保證在編譯階段就計算出表達式的值。所有的長來給本質上都屬於基本類型:數字、布爾型、字符串等。Go語言的常量定義與變量類似,只不過使用了const關鍵字修飾,但不能使用短變量聲明關鍵字 := 來定義常量。

對於常量操作數,所有數學運算、邏輯運算和比較運算的結果依然是常量,常量的轉換結果和某些內置函數的返回值(例如len、cap、real、imag、complex和unsafe.Sizeof)同樣是常量。

常量聲明可以同時指定類型和值,如果沒有顯式指定類型,則類型根據右邊的表達式推斷。若同時聲明一組變量,除了第一項之外,其他項在等號右側的表達式都可以省略,這意味着會複用前面一項的表達式及其類型。

const (
    a = 1
    b
    c = 2
    d
)

fmt.Pritln(a, b, c, d) //1 1 2 2

常量生成器iota

常量的聲明可以使用常量生成器iota,它創建一系列相關值,常量聲明中iota從0開始取值,逐項加1,這與C++中的枚舉型(enumeration)相同。下面是time包中對Weekday類型的定義:

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

上面的聲明中,Sunday的值爲0,Monday爲1,依此類推。

iota結合算術運算還有更復雜的應用,如表示1024的冪:

const (
    _ = 1 << (10 * iota)
    KB
    MB
    GB
    TB
    PB
)

無類型常量

Go語言的常量雖然可以是任何基本數據類型,但許多常量並不從屬某一具體類型。編譯器將這些從屬類型特定的常量表示成某些值,這些值比基本類型的精度更高,且算術精度高於原生的機器精度。可以認爲它們的精度至少達到256位。從屬類型待定的常量共有6種,分別是無類型布爾、無類型整數、無類型文字符號、無類型浮點數、無類型複數、無類型字符串。

只有常量纔可以是無類型的。若將無類型常量聲明爲變量,或在類型明確的變量賦值的右方出現無類型常量,則常量會被隱式轉換爲該變量的類型。

var f float64 = 3 + 0i //無類型複數→float64
f = 2 //無類型整數→int

推遲確定從屬類型使得無類型常量不僅能暫時維持更高的精度,與類型已確定的常量相比,它們還能寫進更多表達式而無須轉換類型。以下面的程序爲例:

const (
    x = 9223372036854775808
    y = 20
)

//fmt.Printf("%T\n", x)
fmt.Println(x/y)

變量x的值用哪種整數類型都無法存儲,如果輸出x的類型則會編譯錯誤並提示:constant 9223372036854775808 overflows int,說明這是一個溢出的整數。但執行x/y卻可以編譯成功並得出正確結果。

字面值常量的類型由語法決定。0、0.0、0i和'\u0000'都表示相同的常量值,但類型卻不同。再比如,除法運算中操作數的類型對除法結果得到的類型會產生影響,因此常量除法表達式中,操作數選擇不同的寫法會影響結果。

 

                                                                                                                                     本文部分內容摘自《Go程序設計語言》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章