常量是一種表達式,在程序編譯階段就計算出其值,在程序運行時沒法改變該值,從而使編譯器得以知曉其值(編譯優化),減小運行時的錯誤,提高運行時的性能。golang
全部常量的數據類型都屬於基本類型:布爾型、數字型(整數型、浮點型和複數)和字符串型。數組
常量做爲操做數時,全部算術運算、邏輯運算和比較運算的結果依然是常量,常量的類型轉換結果和某些內置函數的返回值,例如len、cap、real、imag、complex和unsafe.Sizeof,一樣是常量。bash
常量的聲明格式:ide
const identifier [type] = value
複製代碼
能夠省略類型說明符 [type],由於編譯器能夠根據右邊的表達式來推斷其類型。函數
顯式類型定義: const b string = "abc"
性能
隱式類型定義: const b = "abc"
優化
多重賦值的聲明能夠簡寫爲:ui
const c_name1, c_name2 = value1, value2
複製代碼
批量聲明常量:spa
const (
Unknown = 0
Female = 1
Male = 2
)
複製代碼
由於常量是在編譯器肯定的,所以能夠做爲一些複雜類型的組成部分,好比數組類型的長度:code
const IPv4Len = 4
var p [IPv4Len]byte
複製代碼
由於常量做爲操做數時返回結果仍然爲常量,所以常量能夠用len()、cap()、 unsafe.Sizeof()函數計算表達式的值。常量表達式中,函數必須是內置函數,不然編譯不過:
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
fmt.Println(a, b, c) // abc 3 16
複製代碼
批量聲明常量時,除了第一個常量,其它常量聲明時的右邊表達式均可以省略。若是某個常量的右邊表達式缺失,則該常量的值和類型等於前面常量的值和類型,例如:
const (
a = 1
b
c = 2
d
)
fmt.Println(a, b, c, d) // 1 1 2 2
複製代碼
實際應用中,上面的代碼並無太多實用價值,可是能夠利用它實現iota語法。
iota是golang語言的常量計數器,只能在常量的表達式中使用,屬於特殊常量,能夠認爲是一個能夠被編譯器修改的常量。
iota在const關鍵字出現時將被重置爲0(const內部的第一行以前),const中每新增一行常量聲明將使iota計數一次(iota可理解爲const語句塊中的行索引)。
理解:
- iota只能在常量的表達式中使用, 反之
fmt.Println(iota)
編譯錯誤: undefined: iota- 每次 const 出現時,都會讓 iota 初始化爲0。
const a = iota // a = 0 const ( b = iota // b = 0 c // c = 1 ) 複製代碼
iota 用法
const (
a = iota
b = iota
c = iota
)
複製代碼
自增加常量常常包含一個自定義枚舉類型,容許你依靠編譯器完成自增設置。
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
複製代碼
可使用下劃線跳過不想要的值
type AudioOutput int
const (
OutMute AudioOutput = iota // 0
OutMono // 1
OutStereo // 2
_ // iota += 1
_ // iota += 1
OutSurround // 5
)
複製代碼
const (
_ = 1 << (10 * iota)
KiB // 1024
MiB // 1024 * 1024
GiB // 1024 * 1024 * 1024
)
複製代碼
const (
Apple, Banana = iota + 1, iota + 2 // Apple:1, Banana:2
Cherimoya, Durian // Cherimoya:2, Durian:3
Elderberry, Fig // Elderberry:3, Fig:4
)
複製代碼
const (
i = iota // i = 0
j = 3.14 // j = 3.14, iota += 1
k = iota // k = 2, iota += 1
l // l = 3
)
複製代碼