Go語言const關鍵字理解
const
const用來定義常量,所謂常量,就是在定義之後,其值不允許被修改。定義常量的格式是:
const 常量名 [型別] = 值
在定義常量時,可以不指定型別,golang編譯器會自動推匯出常量型別。定義字串型別常量的寫法:
const hi = "this is my first const"
or
const hi string = "this is my first const"
定義一個值為0的int型別常量寫法
const num int = 0
or
const num = 0
在golang中有一個特殊的變數iota,這個變數只能與const搭配使用。iota的含義是初始化一個計數器,這個計數器的影響範圍只能是const後括號作用域範圍內的常量。如定義5個常量,值分別是0,1,2,3,4,寫法如下:
package main
import (
"fmt"
)
func main() {
const (
NUM1 = iota
NUM2
NUM3
NUM4
NUM5
)
const (
A = iota
B
C
D
)
fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)
fmt.Println(A, B, C)
}
輸出結果如下:
0 1 2 3 4
0 1 2
如下圖:
從上邊的示例中可以發現NUM1被賦值成iota,從列印資訊可以看出,iota的初始值是0。上邊究竟發生了什麼呢? 原來,iota把初始值0賦給NUM1後,自增1,此時iota等於1,隨後將1賦值給常量NUM2,賦值完成後,iota又自增1,此時iota等於2,這個自增過程,只會出現在const後括號範圍內,超過這個括號作為域。再次使用iota時,其初始值為0。從輸出結果可知,常量A從0開始,可以證實這個觀點。
在const後邊的括號作用域內,iota是否真的在自增1呢?請看下邊的示例程式碼:
package main
import (
"fmt"
)
func main() {
const (
NUM1 = iota
NUM2
NUM3 = iota
NUM4
NUM5
)
const (
A = iota
B
C
D
)
fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)
fmt.Println(A, B, C)
}
輸出資訊是:
0 1 2 3 4
0 1 2
iota會自動初始化括號作用域內iota前邊的常量嗎?答案是:不能
// 錯誤示例程式碼
package main
import (
"fmt"
)
func main() {
const (
NUM1
NUM2
NUM3 = iota
NUM4
NUM5
)
fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)
}
編譯時產生的錯誤資訊:
# command-line-arguments
./linuxidc.com.go:9:3: missing value in const declaration
./linuxidc.com.go:10:3: missing value in const declaration
./linuxidc.com.go:15:14: undefined: NUM1
./linuxidc.com.go:15:20: undefined: NUM2
如下圖:
從上邊的示例程式碼中可以得知,iota並不會給括號作用域範圍內,使用iota賦值的那個常量之前的常量賦值,只會給括號作用域內使用iota初始化的那個常量後邊的所有常量自增1後賦值,結論有些繞口,以上邊的示例程式碼為例,NUM3使用iota初始化,NUM4,NUM5在NUM3後邊,所以被自動賦值,而NUM1,NUM2在NUM3前邊,所以不會被自動賦值。
iota預設初始值為0,那麼假如我們定義的常量初始值從100開始,那怎麼來寫呢?
package main
import (
"fmt"
)
func main() {
const (
NUM1 = iota + 100
NUM2
NUM3
NUM4
NUM5
)
fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)
}
輸出結果:
100 101 102 103 104
上邊通過表示式的方式初始化NUM1,使得括號作用域內的常量從100開始遞增。那麼是不是表示iota的值從100開始自增1呢?答案是:不是的。當使用帶iota的表示式初始化常量時,括號作用域內,後邊的常量在初始化時,也會使用這個表示式進行初始化。相當於NUM2初始化表示式是:1+100,NUM2初始化的值是:2+100,以此類推。整個初始化過程中,依然是iota在自增1。
使用帶iota表示式初始化常量時,括號作用域內能否使用多個表示式呢?答案是:可以,示例程式碼如下:
package main
import (
"fmt"
)
func main() {
const (
NUM1 = iota + 100
NUM2 = iota
NUM3 = iota + 10
NUM4
NUM5
)
fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)
}
輸出資訊是:
100 1 12 13 14
如下圖:
從上邊的輸出資訊可以得知,在使用表示式初始化常量時,會使用離被初始化常量前邊最近的那個表示式。如初始化NUM4時,使用的是:3+10,初始化NUM2時,使用的是iota,此時的iota值為1。
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-11/155325.htm