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)換。
}