Golang 學習——常量 const 和 iota

相守之路發表於2020-05-05

Golang中常量const和iota學習

常量是一個簡單值的識別符號,在程式執行時,不會被修改的量。

Java程式設計規範中,常量一般都是全大寫字母,但是在Golang中,大小寫是具有一定含義的,所以不一定所有常量都得全大寫

Golang中,大寫字母開頭表示public,小寫字母開頭表示private

1.語法

const  常量名  [資料型別] =  value 

資料型別可以忽略不寫,Golang編譯器會自動推斷出資料型別。

在使用時,要注意以下幾點:

  1. 資料型別只可以是布林型、數字型(整數型、浮點型和複數)和字串型
  2. 滿足多重賦值
  3. 常量只定義不使用,編譯不會報錯
  4. 常量可以作為列舉,常量組
  5. 常量組中如不指定型別和初始化值,則與上一行非空常量右值相同
  6. 顯示指定型別的時候,必須確保常量左右值型別一致,需要時可做顯示型別轉換。這與變數就不一樣了,變數是可以是不同的型別值

2.例項

1.定義單個常量

const monday int = 1 // 顯式型別定義
const tuesday = "2"  // 隱式型別定義
const wednesday = 3  // 不使用 編譯不會報錯
fmt.Printf("monday 的資料型別為:%T,值為:%d\n", monday, monday)
fmt.Printf("tuesday 的資料型別為:%T,值為:%s\n", tuesday, tuesday)

輸出為:

monday 的資料型別為:int,值為:1
tuesday 的資料型別為:string,值為:2

2.定義一組常量

Golang中沒有列舉型別,不像Java或Python中有Enum類可以實現列舉,所以Golang通過 const來實現列舉

const monday, tuesday, wednesday = 1, 2, 3
// 更推薦以下定義方式
const (
    one   = 1
    two   = 2
    three = 3
)

一組常量中,如果某個常量沒有初始值,預設和上一行一致

const (
    one   = 1
    two   = 2
    three = 3
    four
    five
)
fmt.Printf("four 的資料型別為:%T, 值為:%d\n", four, four)
fmt.Printf("five 的資料型別為:%T, 值為:%d\n", five, five)

輸出為:

four 的資料型別為:int, 值為:3
five 的資料型別為:int, 值為:3

寫到這裡,不知道有沒有這樣一個想法,如果我的常量很多,難道每一個常量都要一一賦值嗎?

Golang中有一個關鍵字,可以解決這個問題,在定義列舉時,通常都會結合const來使用

iota,特殊常量,可以認為是一個可以被編譯器修改的常量

1.知識點

在使用iota時,需要注意以下幾點:
**1. 每當定義一個const,iota的初始值為0

  1. 每當定義一個常量,就會自動累加1**
  2. 直到下一個const出現,清零
  3. 如果中斷iota自增,則必須顯式恢復。且後續自增值按行序遞增

5. 自增預設是int型別,可以自行進行顯示指定型別
6. iota 可以參與運算

加粗的部分是需要重點關注的,現在例項演示一下

2.例項

1.定義const列舉,首項為iota

const (
    one   = iota //iota初始值為0
    two   = iota //自增1
    three = iota //再自增1
)
fmt.Println("one 的值為:", one)
fmt.Println("two 的值為:", two)
fmt.Println("three 的值為:", three)

輸出:

one 的值為: 0
two 的值為: 1
three 的值為: 2

可以看到,每一項都自增了1。 在定義時,不需要每次都寫 iota,結合const的特性,iota除了首項之外,後續常量不顯示寫 iota,都會自增

2.不顯示寫 iota,常量也會自增

const (
    one   = iota //iota初始值為0
    two        
    three
    four
)
fmt.Println("one 的值為:", one)
fmt.Println("two 的值為:", two)
fmt.Println("three 的值為:", three)
fmt.Println("four 的值為:", four)

輸出:

one 的值為: 0
two 的值為: 1
three 的值為: 2
four 的值為: 3

難道iota只能定義 0,1,2,3嗎? 如果有別的值想用怎麼辦?

Golangiota有一個非常非常好用的特性:iota可以參與計算

3.iota參與計算

比如,定義b,kb,mb….等等

const (
        b  = 1 << (iota * 10) // iota初始值為0 ,所以 1 << (0 * 10)
        kb                    // 1 << (1 * 10)
        mb                    // 1 << (2 * 10)
        gb                    // 1 << (3 * 10)
        tb                    // 1 << (4 * 10)
        pb                    // 1 << (5 * 10)
    )
fmt.Println(b, kb, mb, gb, tb, pb)

輸出:

1 1024 1048576 1073741824 1099511627776 1125899906842624

是不是非常好用? 雖然Golang中沒有列舉類,但是通過 constiota也可以方便的實現列舉

在實際開發中,列舉類通常都是有一定意義的,比如:月份,vip等級……

上面的例子中,只是簡單的定義了數字常量,我們可以定義一個具體型別,來表示這些常量,實現一個有意義的列舉

type VipLevel int
const (
    vipOne VipLevel = 1 + iota
    vipTwo  
    vipThree 
    vipFour
    vipFive
)
fmt.Println(one, two, three, four, five)

輸出:

1 2 3 4 5

總結一下,constiota通常結合使用來定義列舉,為了使列舉更有意義,會自定義 type 型別。

要多注意 constiota的特性,在使用的時候留心下,熟能生巧,勤練習,勤思考。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章