最近在學習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聲明塊內的行索引。」這一句話了。