這是一個建立於
的文章,其中的資訊可能已經有所發展或是發生改變。
下面一句摘自《Go語言編程》:
“go語言中,常量是無類型的。只要這個常量在相應類型的範圍範圍內,就可以作為該類型的常量,比如常量-12,它可以賦值給int、int32、int64、float32、float64、complex64、complex128等類型的變數。”
註:個人理解,這裡的“無類型”,個人理解是不固定類型,並不是真的沒有類型。
1、常量定義:const
go語言中常量定義和C++中的關鍵字一樣,直接用const關鍵字定義。
不同的是,go中用const定義常量時,後面的常量類型不是必須的,個人感覺可以從2個方面理解:
(1).如本檔案開頭所述,go語言中常量不固定類型,編譯器自己根據等號右邊的值確定類型;
(2).也可以理解為const這個關鍵字和var類似,用關鍵字定義變數(常量)同時初始化的時候,可以不需要類型。
常量定義必須是在編譯期能確定的值,如:
const tmpConst 1 << 3
由於1 << 3在編譯期可以確定值,所以這行命令沒問題,下面的命令會編譯出錯:
const Home = os.GetEnv(“HOME”)
這個命令要在運行GetEnv後得到值才能確定,所以這個命令編譯會出錯。
2、預定義常量
go語言中預定義常量有:ture, false和iota。
ture和false比較容易理解,分別為邏輯真和邏輯假。
iota這個常量比較特殊,iota每次遇到const,就會被置位成0,如果遇到的不是const,則每出現一次iota,iota的值就增加1。如:
const ( //遇到const,iota被賦值成0
c0 = iota //這時,tota == 0,所以c0 == 0,同時iota++,所以這個賦值完後iota== 1
c1 = iota //c1 == 1
c2 = iota //c2 == 2
)
如果兩個const的指派陳述式的運算式是一樣的,那麼可以省略後面一個賦值運算式,編譯器會預設其和前面的運算式一樣。如:
const
(
c0 = iota
c1 //等價於c1 = iota
c2 //等價於c2 = iota
)
const
(
c0= 3
c1 //等價於c1 = 3
c2 //等價於c2 = 3
)
3、枚舉
go語言中並沒有提供enum關鍵字定義枚舉類型,要實現枚舉的功能,可以使用上一節中的 const +iota來實現。如:
const
(
Sunday=iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays//這個常量沒有匯出
)
註:go語言中,大寫字母開始的符號是“public”的,可以被包外看到,所以上面的numberOfDays只能在本包內可見。