go語言學習之常量
常量在使用關鍵字
const
定義,用于存儲不會改變的資料。
存儲在常量中的資料類型隻可以是布爾型、數字型(整數型、浮點型和複數)和字元串型。
常量的定義格式:
const identifier [type] = value
,例如
在go語言中,你可以省略類型說明符
[type]
,因為編譯器可以根據變量的值來推斷其類型。
- 顯示類型定義:
const b string = "abc"
- 隐式類型定義:
一個沒有指定類型的常量被使用時會根據其使用環境而推斷出它所需要具備的類型。話句話說,未定義類型的常量會在必要時刻根據上下文來獲得相關類型。const b = "abc"
1. var n int
2. f(n + 5) // 無類型的數字型常量"5"它的類型在這裡變成了 int
常量的值必須是能夠在編譯時就能夠确定的;你可以在其指派表達式中設計計算過程,但是所有用于計算的值必須在編譯期間就能獲得。
- 正确的做法:
const c1 = 2/3
- 錯誤的做法:
// 引發建構錯誤const c2 = getNumber()
因為在編譯期間自定義函數均屬于未知,是以無法用于常量的指派,但内置函數可以使用,如:len()。getNumber() used as value
數字型的常量是沒有大小和符号的,并且可以使用任何精度而不會導緻溢出:
1. const Ln2= 0.693147180559945309417232121458\
176568075500134360255254120680009
2. const Log2E= 1/Ln2 // this is a precise reciprocal
3. const Billion = 1e9 // float constant
4. const hardEight = (1 << 100) >> 97
根據上面的例子我們可以看出,反斜杠
\
可以在常量表示式中作為多行的連接配接符使用。
與各種類型的數字型變量相比,你無需擔心常量之間的類型轉換問題,因為它們都是非常理想的數字。
不過需要注意的是,當常量指派給一個精度過小的數字型變量是,可能會因為無法正确表達常量所代表的數值而導緻溢出,這會在編譯期間就引發錯誤。另外,常量也允許使用并行指派的形式:
1. const beef, two, c = "eat", 2, "veg"
2. const Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
3. const (
4. Monday, Tuesday, Wednesday = 1, 2, 3
5. Thursday, Friday, Saturday = 4, 5, 6
6. )
還可以用作枚舉:
1. const (
2. Unknown = 0
3. Female = 1
4. Male = 2
5. )
現在,數字0、1和2分别代表未知性别、女性和男性。這些枚舉值可以用于測試某個變量或常量的實際值,比如使用switch/case結構
在這個例子中,
iota
可以用作枚舉值:
1. const (
2. a = iota
3. b = iota
4. c = iota
5. )
第一個
iota
等于0,每當
iota
在新的一行被使用時,它的值都會自動加1;是以
a=0, b=1 c=2
可以簡寫為如下形式:
1. const (
2. a = iota
3. b
4. c
5. )
iota
也可以用在表達式中,如:
iota + 50
。在每遇到一個新的常量塊或單個常量聲明時,
iota
都會重置為0(簡單地講,每遇到一次const關鍵字,
iota
就重置為0)。
當然,之是以為常量就是恒定不變的量,是以我們無法在程式運作過程中修改它的值;如果你在代碼中試圖修改常量的值則會引發編譯錯誤。
引用
time
包中的一段代碼作為示例:一周中每天的名稱
1. const (
2. Sunday = iota
3. Monday
4. Tuesday
5. Wednesday
6. Thursday
7. Friday
8. Saturday
9. )
你也可以使用某個類型作為枚舉常量的類型:
1. type Color int
2. const (
3. RED Color = iota // 0
4. ORANGE // 1
5. YELLOW // 2
6. GREEN // ..
7. BLUE
8. INDIGO
9. VIOLET // 6
10. )