天天看點

【Go語言】【3】GO語言常量

  通常情況下語言入門前會講一堆背景和特性,目的是為了能讓學習者對該語言有一個大概的認識,但這裡我想直接進入細節,不是因為任性,而是因為常量是程式設計語言最基本的組成元素,這與語言背景無關。

一、字面常量

在說明字面常量之前先說一下魔鬼數字,哪麼什麼是魔鬼數字呢?

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

【Go語言】【3】GO語言常量

值得一提的是,上面的寫法可以簡寫如下:

    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語言】【3】GO語言常量

【編後話】:

開始接觸GO,感覺它就是一個大雜燴,裡面即有C語言的影子,也有Java語言的影子,也有JavaScript腳本的影子,同時還有Pascal語言的痕迹,但使用使用着感覺這符合人的正常思維,代碼想怎麼寫就怎麼寫,無論怎麼寫好像都符合GO的文法。借用知乎使用者的話講:GO語言是一門看似簡單實際并不簡單,貌似外表醜陋實則另有考究的語言。