golang 學(xué)習(xí)筆記 1.2 常量

1.2 常量

常量值必須是編譯期可確定的數(shù)字、字符串、布爾值。

const x, y int = 1, 2 // 多常量初始化
const s = "Hello, World!" // 類型推斷

const ( // 常量組
    a, b = 10, 100
    c bool = false
)

func main() {
    const x = "xxx" // 未使用局部常量不會引發(fā)編譯錯誤。
}

不支持 1UL、2LL 這樣的類型后綴。

在常量組中,如不提供類型和初始化值,那么視作與上一常量相同。

const (
    s = "abc"
    x // x = "abc"
)

常量值還可以是 len、cap、unsafe.Sizeof 等編譯期可確定結(jié)果的函數(shù)返回值。

const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(b)
)

如果常量類型足以存儲初始化值,那么不會引發(fā)溢出錯誤。

const (
    a byte = 100 // int to byte
    b int = 1e20 // float64 to int, overflows
)
枚舉

關(guān)鍵字 iota 定義常量組中從 0 開始按行計(jì)數(shù)的自增枚舉值。

const (
    Sunday = iota // 0
    Monday // 1,通常省略后續(xù)行表達(dá)式。
    Tuesday // 2
    Wednesday // 3
    Thursday // 4
    Friday // 5
    Saturday // 6
)

const (
    _ = iota // iota = 0
    KB int64 = 1 << (10 * iota) // iota = 1
    MB // 與 KB 表達(dá)式相同,但 iota = 2
    GB
    TB
)

在同一常量組中,可以提供多個 iota,它們各自增長。

const (
    A, B = iota, iota << 10 // 0, 0 << 10
    C, D // 1, 1 << 10
)

如果 iota 自增被打斷,須顯式恢復(fù)。

const (
    A = iota // 0
    B // 1
    C = "c" // c
    D // c,與上一行相同。
    E = iota // 4,顯式恢復(fù)。注意計(jì)數(shù)包含了 C、D 兩行。
    F // 5
)

可通過自定義類型來實(shí)現(xiàn)枚舉類型限制。

type Color int

const (
    Black Color = iota
    Red
    Blue
)

func test(c Color) {}

func main() {
    c := Black
    test(c)

    x := 1
    test(x) // Error: cannot use x (type int) as type Color in function argument
    test(1) // 常量會被編譯器自動轉(zhuǎn)換。
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容