通常情況下語言入門前會講一堆背景和特性,目的是為了能讓學習者對該語言有一個大概的認識,但這裡我想直接進入細節,不是因為任性,而是因為常量是程式設計語言最基本的組成元素,這與語言背景無關。
一、字面常量
在說明字面常量之前先說一下魔鬼數字,哪麼什麼是魔鬼數字呢?
func calculatePrice(price float32) float32{
return price * 0.8
}
這個方法中的0.8就是魔鬼數字(沒有具體含義),它導緻代碼難以了解,這裡的0.8表示折扣的意思,為了清晰起見,上面的代碼可以如下修改:
const discount float64 = 0.8 // 定義折扣常量
func calculatePrice(price float32) float32{ // 計算折扣後的價格
return price * discount
這個例子中的魔鬼數字就是字面常量的一種,除了浮點型之外,還可以有整型、布爾型、字元串型等字面常面,如:
3.1415926535897932 // 浮點類型的字面常量
-12 //整數類型的字面常量
true //布爾類型的字面常量
"ok" //字元串類型的字面常量
當然GO還有複數常量,如3+2i
二、常量
和其它語言(C、C++、Java等)類似,由const關鍵字修飾,例如:
const PI float64 = 3.1415926535897932
const EluerE float64 = 2.718281828459045
const value int = -12
const width int = 36
const flag bool = false
const isRead bool = true
const str string = "ok"
const bookName string = "Go language"
const rect complex64 = 3 + 2i
const area complex64 = 3.1415 + 3.6i
每個常量定義的形式都必須寫成const constName constType = constValue這種形式嗎?我們是否能省略掉常量類型?當然可以,要知道GO語言是最懂程式員的喲 :)
const PI = 3.1415926535897932
const EluerE = 2.718281828459045
const value = -12
const width = 36
const flag = false
const isRead = true
const str = "ok"
const bookName = "Go language"
const rect = 3 + 2i
const area = 3.1415 + 3.6i
每個常量定義都要寫一次const,是否能省略掉const?這個是不可以的,但可以把上面的定義寫成如下形式:
const (
PI = 3.1415926535897932
EluerE = 2.718281828459045
value = -12
width = 36
flag = false
isRead = true
str = "ok"
bookName = "Go language"
rect = 3 + 2i
area = 3.1415 + 3.6i
)
這樣寫雖然少寫了const,但代碼行數并沒有減少,是以也可以縮寫為:
PI, EluerE, value, width, flag, isRead, str, bookName, rect, area = 3.1415926535897932, 2.718281828459045, -12, 36, false, true, "ok", "Go language", 3 + 2i, 3.1415 + 3.6i
三、常量特點說明
1、沒有private、protected、public修改符
有過Java開發經驗的讀者都清楚private、protected、public修飾符,但GO對你說sorry。GO是怎麼區分常量/變量是對内還是對外的呢?
答案是常量名的首字母是否大寫,若首字母大寫則是對外的,首字母小寫則是對内的,上例中的PI、EluerE就相當于public的,而value、width、flag、isRead等就相當于private
2、類型放在常量名的後面
有過Java開發經驗的讀者都比較熟悉public int value = 10這種定義方式,類型放在變量名value的前面,但GO恰恰相反,偏偏把類型放在後面,例如:const PI float64 = 3.1415926535897932
3、常量定義語句不用分号結束
在Java或C等語言中,一般都是這樣定義:const str string = "ok";但在GO中懶得把分号(;)都省略了。剛開始寫GO代碼很不習慣,總是在後面追加一個分号,然而一儲存Sublime text很貼心地幫我省略掉了
4、常量定義的右值可以是一個編譯期運算的常量表達式
例如:
const algorithm = 255 >> 2
這點與其它語言類似,也容易了解,若右值是運作期才能得到的結果表達式
const Port = os.GetEnv("Port")
那麼在編譯期并不能确定該值,會出現編譯錯誤
四、預定義常量iota
iota是GO所特有的,它在每個const出現時被重置為0,下一個const出現之前,每出現一次iota,其所代表的數字自動增加1,那麼怎麼了解這句話呢?
【例1】:我們定義一個星期的枚舉常量
Sunday = iota //星期天
Monday = iota //星期一
Tuesday = iota //星期二
Wednesday = iota //星期三
Thursday = iota //星期四
Friday = iota //星期五
Saturday = iota //星期六
當每個const出現時iota被重置為0,是以這裡的Sunday值為0,同時後面沒有再出現const,是以第二個iota自動加1,Monday的值為1,依次類推,Saturday的值為6
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauYDM5MncxwmR4gWcOFUQ3h2TYRldlR2dUFTbvl2S39CX0Y0LclTNvwlMw00LcJDMzZWe39CXt92Yu8GdjFTNuMzcvw1LcpDc0RHaiojIsJye.jpg)
值得一提的是,上面的寫法可以簡寫如下:
Sunday = iota //星期天
Monday //星期一
Tuesday //星期二
Wednesday //星期三
Thursday //星期四
Friday //星期五
Saturday //星期六
【例2】:修改一下這個枚舉定義
Sunday = iota //星期天,指派為0
Monday = iota //星期一
Tuesday = iota //星期二
Wednesday = iota //星期三,指派為0
Thursday = iota //星期四
Friday = iota //星期五
Saturday = iota //星期六
當每個const出現時iota被重置為0,是以這裡的Sunday,Monday沒有const出現,其值自動加1,是以Monday為1,同理Tuesday為2;
由于Wednesday之前出現了const,是以Wednesday的值被重置為0,而Thursday、Friday、Saturday後面再沒有const出現,是以Thursday、Friday、Saturday值自動加1,依次為1、2、3
【編後話】:
開始接觸GO,感覺它就是一個大雜燴,裡面即有C語言的影子,也有Java語言的影子,也有JavaScript腳本的影子,同時還有Pascal語言的痕迹,但使用使用着感覺這符合人的正常思維,代碼想怎麼寫就怎麼寫,無論怎麼寫好像都符合GO的文法。借用知乎使用者的話講:GO語言是一門看似簡單實際并不簡單,貌似外表醜陋實則另有考究的語言。