《Go語言四十二章經(jīng)》第四章 常量
作者:李驍
4.1 常量以及iota
常量使用關(guān)鍵字 const 定義门岔,用于存儲不會改變的數(shù)據(jù)。常量不能被重新賦予任何值。
存儲在常量中的數(shù)據(jù)類型只可以是布爾型肪获、數(shù)字型(整數(shù)型、浮點型和復(fù)數(shù))和字符串型柒傻。
常量的定義格式:const identifier [type] = value孝赫,例如:
const Pi = 3.14159
在 Go 語言中,你可以省略類型說明符 [type]红符,因為編譯器可以根據(jù)變量(常量)的值來推斷其類型青柄。
顯式類型定義: const b string = "abc"
隱式類型定義: const b = "abc"
Go的常量定義可以限定常量類型,但不是必需的预侯。如果定義常量時沒有指定類型致开,那么它與字面常量一樣,是無類型(untyped)常量萎馅。一個沒有指定類型的常量被使用時双戳,會根據(jù)其使用環(huán)境而推斷出它所需要具備的類型。換句話說糜芳,未定義類型的常量會在必要時刻根據(jù)上下文來獲得相關(guān)類型飒货。
字面常量(literal),是指程序中硬編碼的常量峭竣,如:-12膏斤。它們的值即為它們本身,是無法被改變的邪驮。
常量的值必須是能夠在編譯時就能夠確定的;你可以在其賦值表達式中涉及計算過程傲茄,但是所有用于計算的值必須在編譯期間就能獲得毅访。
Go語言預(yù)定義了這些常量: true、 false和iota盘榨。布爾常量只包含兩個值:true 和 false喻粹。iota比較特殊,可以被認(rèn)為是一個可被編譯器修改的常量草巡,在每一個const關(guān)鍵字出現(xiàn)時被重置為0守呜,然后在下一個const出現(xiàn)之前,每出現(xiàn)一次iota,其所代表的數(shù)字會自動增1查乒。
在這個例子中弥喉,iota 可以被用作枚舉值:
const (
a = iota
b = iota
c = iota
)
第一個 iota 等于 0,每當(dāng) iota 在新的一行被使用時玛迄,它的值都會自動加 1由境;所以 a=0, b=1, c=2 可以簡寫為如下形式:
const (
a = iota
b
c
)
注意:
const (
a = iota
b = 8
c
)
a, b, c分別為0, 8, 8,新的常量b聲明后蓖议,iota 不再向下賦值虏杰,后面常量如果沒有賦值,則繼承上一個常量值勒虾。
可以簡單理解為在一個const塊中纺阔,每換一行定義個常量,iota 都會自動+1修然。
( 關(guān)于 iota 的使用涉及到非常復(fù)雜多樣的情況 租副,這里不展開來講了帚湘,有興趣可以查查資料研究)
iota 也可以用在表達式中,如:iota + 50。在每遇到一個新的常量塊或單個常量聲明時久橙, iota 都會重置為 0( **簡單地講,每遇到一次 const 關(guān)鍵字恐疲,iota 就重置為 0 ** )草则。
使用位左移與 iota 計數(shù)配合可優(yōu)雅地實現(xiàn)存儲單位的常量枚舉:
type ByteSize float64
const (
_ = iota // 通過賦值給空白標(biāo)識符來忽略值
KB ByteSize = 1<<(10*iota)
MB
GB
TB
PB
EB
ZB
YB
)
數(shù)值常量(Numeric constants)包括整數(shù),浮點數(shù)以及復(fù)數(shù)常量雄妥。數(shù)值常量有一些微妙之處最蕾。
package main
import (
"fmt"
)
func main() {
const a = 5
var intVar int = a
var int32Var int32 = a
var float64Var float64 = a
var complex64Var complex64 = a
fmt.Println("intVar", intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var", complex64Var)
}
程序輸出
intVar 5
int32Var 5
float64Var 5
complex64Var (5+0i)
在這個程序中,a 的值是 5 并且 a 在語法上是泛化的(它既可以表示浮點數(shù) 5.0老厌,也可以表示整數(shù) 5瘟则,甚至可以表示沒有虛部的復(fù)數(shù) 5 + 0i),因此 a 可以賦值給任何與之類型兼容的變量枝秤。像 a 這種數(shù)值常量的默認(rèn)類型可以想象成是通過上下文動態(tài)生成的醋拧。
當(dāng)然,常量之所以為常量就是恒定不變的量淀弹,因此我們無法在程序運行過程中修改它的值丹壕;如果你在代碼中試圖修改常量的值則會引發(fā)編譯錯誤。同時薇溃,在const 定義中菌赖,對常量名沒有強制要求全部大寫,不過我們一般都會全部字母大寫沐序,以便閱讀琉用。
本書《Go語言四十二章經(jīng)》內(nèi)容在github上同步地址:https://github.com/ffhelicopter/Go42
本書《Go語言四十二章經(jīng)》內(nèi)容在簡書同步地址: http://www.reibang.com/nb/29056963雖然本書中例子都經(jīng)過實際運行堕绩,但難免出現(xiàn)錯誤和不足之處,煩請您指出邑时;如有建議也歡迎交流奴紧。
聯(lián)系郵箱:roteman@163.com