【GO基礎】神奇的iota特殊常量

最近在學習GO語言,而後發現有一個特殊常量是之前沒有接觸過的,比較感興趣,這裏給你們介紹一下。學習

iota,特殊常量,能夠被認爲是一個能夠被編譯器修改的常量。spa

核心概念:iota在const關鍵字出現時將被重置爲0(const內部的第一行以前),const中每新增一行常量聲明將使iota計數一次。code

這麼來看,簡單的來講,iota能夠被認爲是單個const聲明塊內的行索引blog

咱們先來看一個例子,你就能簡單的理解iota的基本做用:索引

// heihei
package main

import (
    "fmt"
)

func main() {
    const a=iota //第一個const聲明塊,僅聲明瞭一個a.iota在此次賦值時值爲0,賦值完成後,a聲明語句執行完畢,iota等於1.
    const (
        b=iota
        c=iota
    ) //第二個const聲明塊,聲明瞭兩個值b和c.可是在這裏的一開始,iota依然等於0,由於這是一個新的const聲明塊的開始.隨後,iota在給b賦值完畢後,b聲明語句執行完畢,iota變成1,而後對c同理.
    fmt.Printf("%d", a) //由上可知,此處輸出爲0
    fmt.Println()
    
    fmt.Printf("%d,%d",b,c) //由上可知,此處輸出爲0,1
    fmt.Println()

}

如上的代碼,運行結果以下:字符串

可見,與註釋處的說明是一致的。編譯器

下面再介紹一個簡寫的形式,先來看代碼:io

// heihei
package main

import (
    "fmt"
)

func main() {
    const (
        a = iota
        b
        c
    )

    fmt.Printf("%d,%d,%d", a, b, c)
    fmt.Println()

}

在這個例子中,const聲明塊裏採起了簡寫的形式,即:若當前行沒有賦值語句被書寫,則賦值自動採用向上、最近的一個有賦值語句的右側值。因爲b、c均沒有賦值,因此,會自動採用最近的一個賦值的值,也就是iota。編譯

那麼,想必在這樣的操做下,你們應該明白會輸出什麼了。對了,就是0,1,2.class

那麼,若是賦值的不是單變量/常量,而是一個表達式,結果會發生變化嗎?咱們來看代碼:

// heihei
package main

import (
    "fmt"
)

func main() {
    const (
        i = 3 << iota
        j
        k
    )

    fmt.Printf("%d,%d,%d", i, j, k)
    fmt.Println()
}

先來看結果:

能夠看到,這樣,依然知足前述「省略賦值」狀況下的規則,依然是複製了向上、最近的右側表達式。

好,在瞭解了上述的一些規則和基礎以後,咱們來看一個稍微複雜一點的例子,直接上代碼:

// heihei
package main

import (
    "fmt"
)

func main() {
    const (
        a = 666
        b = iota
        c
        d = "hehehe"
        e
        f = 2 << iota
    )

    fmt.Printf("%d,%d,%d,%s,%s,%d", a, b, c, d, e, f)
    fmt.Println()
}

(請自敲代碼復刻的注意,由以前規則,能夠預見d和e一定爲字符串,因此格式輸出時換成了%s。固然,也歡迎你繼續保持%d,看看結果如何~)

咱們先來看結果:

能夠看到,在依然遵循了「未當場賦值的聲明遵循向上、最近的賦值表達式」這一規則下,即便中間的賦值再也不和iota有關,iota依然保持了計數。並在中間的結果中得以體現。

換言之——即便你的表達式中從未出現iota,「幽靈般」的iota依然會默默進行計數,其計數規則與最開始所闡述保持一致。

如今,你應該能更加深入的理解「簡單的來講,iota能夠被認爲是單個const聲明塊內的行索引。」這一句話了。

相關文章
相關標籤/搜索