首頁 > 軟體

一文搞懂Golang中iota的用法和原理

2022-08-30 14:03:14

前言

我們知道iota是go語言的常數計數器,只能在常數的const表示式中使用,在const關鍵字出現的時將被重置為0const中每新增一行常數宣告iota值自增1(iota可以理解為const語句塊中的行索引),使用iota可以簡化常數的定義,但其規則必須要牢牢掌握,否則在我們開發中可能會造成誤解,本文嘗試全面總結其使用用法以及其實現原理,需要的朋友可以參考以下內容,希望對大家有幫助。

iota的使用

iota在const關鍵字出現時將被重置為0

iota只能在常數的表示式中使用,iotaconst關鍵字出現時將被重置為0。不同const定義塊互不干擾。

//const關鍵字出現時將被重置為0
const (
    a = iota  //0
    b         //1
)
//不同const定義塊互不干擾
const (
    c = iota //0
)

按行計數

const每新增一行常數宣告,iota計數一次,可以當做const語句中的索引,常用於定義列舉資料。

const (
    n1 = iota //0
    n2 		  //1
    n3 		  //2
    n4 		  //3
)

所有註釋行和空行全部忽略

所有註釋行和空行在編譯時期首先會被清除,所以空行不計數。

const (
    a = iota  //0
    
    b		  //1
    
    //此行是註釋
    c         //2
)

跳值佔位

如果某個值不需要,可以使用佔位 “_”,它不是空行,會進行計數,起到跳值作用。

const (
    a = iota //0
    _
    b        //2
)

多個iota

同一const塊出現多個iota,只會按照行數計數,不會重新計數。

const (
    a = iota     // a=0
    b = iota     // b=1
    c = iota     // c=2
  )

一行多個iota

一行多個iota,分別計數。

const (
    a, b = iota, iota // a=0,b=0
    c, d              // c=1,d=1
)

首行插隊

開頭插隊會進行計數。

const (
    a = 100 //  a=100
    b = iota // b=1
    c = iota // c=2
    d        // d=3
)

中間插隊

中間插隊會進行計數。

const (
    a = iota // a=0
    b = 100  // b=100
    c = iota // c=2
    d        // d=3
)

沒有表示式的常數定義複用上一行的表示式

const (
   a = iota       //  iota = 0 
   b = 1 + iota  // iota = 1
   c           // iota = 2
)

實現原理

iota定義

iota 原始碼在 Go 語言程式碼庫中的定義位於內建檔案 go/src/builtin/builtin.go 中:

const iota = 0 // Untyped int.iota

在這裡宣告了一個常數識別符號,它的值是0;iota只是一個簡單的整數0,為什麼能作為常數計數器進行自增的,我們再看一下const的實現。

const

const 塊中每一行在 Go 中使用 spec 資料結構描述, spec 宣告如下:

ValueSpec struct {
 Doc *CommentGroup // associated documentation; or nil
 Names []*Ident // value names (len(Names) > 0)
 Type Expr // value type; or nil
 Values []Expr // initial values; or nil
 Comment *CommentGroup // line comments; or nil
}

在這個結構體中有一個切片 ValueSpec.Names,此切片中儲存了一行中定義的常數,如果一行定義N個常數,那麼 ValueSpec.Names 切片長度即為N。

const塊實際上是spec型別的切片,用於表示const中的多行。

編譯期間構造常數時的偽演演算法如下:

for iota, spec := range ValueSpecs {
 for i, name := range spec.Names {
 obj := NewConst(name, iota...) //此處將iota傳入,用於構造常數
 ...
 }
}

iota實際上是遍歷const塊的索引,每行中即便多次使用iota,其值也不會遞增。

到此這篇關於一文搞懂Golang中iota的用法和原理的文章就介紹到這了,更多相關Golang iota內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com