Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量
1. 常量定義及分類
1.1 定義
常量是指在程序運行時,不會被修改的量。
常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和復數)和字符串型。
常量的定義格式:
const identifier [type] = value
可以省略類型說明符 [type],因為編譯器可以根據變量的值來推斷其類型。
- 顯式類型定義
const b string = "abc"
- 隱式類型定義
const b = "abc"
多個相同類型的聲明可以簡寫為:
const name1, name2 = value1, value2
1.2 分類
2. 常量使用
package mainimport "fmt"func main() {const LENGTH int = 10const WIDTH int = 5 var area intconst a, b, c = 1, false, "str" //多重賦值area = LENGTH * WIDTHfmt.Printf("面積為 : %d", area)println()println(a, b, c)
}
輸出結果為:
面積為 : 50
1 false str
3. 常量作為枚舉
const (Unknown = 0Female = 1Male = 2
)
數字 0、1 和 2 分別代表未知性別、女性和男性。
常量可以用 len(), cap(), unsafe.Sizeof() 函數計算表達式的值。常量表達式中,函數必須是內置函數,否則編譯不過:
在包一級聲明語句聲明的名字可在整個包對應的每個源文件中訪問,而不是僅僅在其聲明語句所在的源文件中訪問。如下代碼中的 a 、 b 、 c 。
package mainimport "unsafe"
const (a = "abc"b = len(a)c = unsafe.Sizeof(a)
)func main(){println(a, b, c)
}
運行結果為:
abc 3 16
注意:字符串類型在 go 里是個結構, 包含指向底層數組的指針和長度,這兩部分每部分都是 8 個字節,所以字符串類型大小為 16 個字節。
4. iota 常量
iota 特殊常量,可以認為是一個可以被編譯器修改的常量。
iota 在 const 關鍵字出現時將被重置為 0 (const 內部的第一行之前),const 中每新增一行常量聲明將使iota 計數一次 ( iota 可理解為 const 語句塊中的行索引)。
iota 可以被用作枚舉值:
const (a = iotab = iotac = iota
)
第一個 iota 等于 0,每當 iota 在新的一行被使用時,它的值都會自動加 1 ;所以 a=0, b=1, c=2 可以簡寫為如下形式:
const (a = iotabc
)
使用示例
package mainimport "fmt"func main() {const (a = iota //0b //1c //2d = "ha" //獨立值,iota += 1e //"ha" iota += 1f = 100 //iota +=1g //100 iota +=1h = iota //7,恢復計數i //8)fmt.Println(a,b,c,d,e,f,g,h,i)
}
輸出結果為:
0 1 2 ha ha 100 100 7 8
4.1 const 作用域只在當前的括號范圍內
iota 的含義是初始化一個計數器,這個計數器的影響范圍只能是 const 后括號作用域范圍內的常量。
package mainimport ("fmt"
)func main() {const (a = iotabcde)const (A = iotaBCD)fmt.Println(a, b, c, d, e)fmt.Println(A, B, C)
}
輸出結果如下:
0 1 2 3 4
0 1 2
iota 把初始值 0 賦給 a 后,自增 1,此時 iota 等于1,隨后將 1 賦值給常量 b,賦值完成后,iota 又自增 1,此時 iota 等于2,這個自增過程,只會出現在 const 后括號范圍內,超過這個括號作為域。再次使用 iota 時,其初始值為 0。從輸出結果可知,常量 A 從 0 開始,可以證實這個觀點。
4.2 const 作用域內,iota 自增 1
package mainimport ("fmt"
)func main() {const (NUM1 = iotaNUM2NUM3 = iotaNUM4NUM5)const (A = iotaBCD)fmt.Println(NUM1, NUM2, NUM3, NUM4, NUM5)fmt.Println(A, B, C)
}
輸出信息是:
0 1 2 3 4
0 1 2
4.3 iota 不會自動初始化括號作用域內 iota 前邊的常量
// 錯誤示例代碼
func main() {const (a bc = iotade)fmt.Println(a, b, c, d, e)
}編譯時產生的錯誤信息:
./hello.go:9:9: missing value in const declaration
./hello.go:10:9: missing value in const declaration
./hello.go:15:17: undefined: a
./hello.go:15:20: undefined: b
從上邊的示例代碼中可以得知,iota 并不會給括號作用域范圍內使用 iota 賦值的那個常量之前的常量賦值,只會給括號作用域內使用 iota 初始化的那個常量后邊的所有常量自增 1 后賦值。
4.4 設定從某個特定初始值開始
iota 默認初始值為 0,我們可以定義的常量初始值從 10 開始,代碼如下:
func main() {const (a = 10 + iotabcde)fmt.Println(a, b, c, d, e)
}
輸出結果:
10 11 12 13 14
當使用帶 iota 的表達式初始化常量時,括號作用域內,后邊的常量在初始化時,也會使用這個表達式進行初始化。相當于初始化表達式是:10+1,b 初始化的值是:10+2,以此類推。整個初始化過程中,依然是 iota 在自增 1。
4.5 const 常量帶有多個 iota 表達式
func main() {const (a = iota + 10b = iotac = iota + 5de)fmt.Println(a, b, c, d, e)
}
輸出信息是:
10 1 7 8 9
從上邊的輸出信息可以得知,在使用表達式初始化常量時,會使用離被初始化常量前邊最近的那個表達式。如初始化 c 時,使用的是 2+5,初始化 b 時,使用的是 iota,此時的 iota 值為 1。
5. 定義常量組不設置初始值
在定義常量組時,如果不提供初始值,則表示將使用上行的表達式值。
package mainimport "fmt"const (a = 1bcd
)func main() {fmt.Println(a)// b、c、d沒有初始化,使用上一行(即a)的值fmt.Println(b) // 輸出1fmt.Println(c) // 輸出1fmt.Println(d) // 輸出1
}
總結
以上是生活随笔為你收集整理的Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人与鸟的画是谁画的啊?
- 下一篇: Go 学习笔记(5)— 算术运算符、关系