您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語言中的iota怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
最近做需求時,有一個需要枚舉的場景,大概有10+個枚舉類型,不愿意像定義一個開關那樣敷衍的寫成
const (
SwitchOff = 0
SwitchOn = 1
)
顯得不夠精致~
于是想到了iota,深入了解了下,這個小東西好像有點東西。
再回到需求本身——枚舉。有了iota,就不用顯示定義一大堆數值了。
未使用iota版本
const (
ColorRed = 0
ColorOrange = 1
ColorYellow = 2
ColorGrassland = 3
ColorCyan = 4
ColorBlue = 5
ColorPurple = 6
)
使用iota版本
const (
ColorRed = iota
ColorOrange
ColorYellow
ColorGrassland
ColorCyan
ColorBlue
ColorPurple
)
兩者的效果是一樣的,各個枚舉對應的值也是一樣的。iota是從0開始,每一行都是往下遞增。乍一看,iota還顯得挺高端。
施展威力的同時,iota也有大家詬病的地方。
比如這時候如果需要添加一個"灰色"的枚舉類型,在未使用iota版本里面不管在什么位置插入這個枚舉,定義一個具體數值即可,比如對應7。
在使用iota版本里面如果加在ColorPurple后面,對應的值就是7,沒有問題。
但是如果在其他位置,那就會打破原來的平衡,比如放在ColorGrassland后
const (
ColorRed = iota // 0
ColorOrange // 1
ColorYellow // 2
ColorGrassland // 3
ColorGray // 4
ColorCyan // 5
ColorBlue // 6
ColorPurple // 7
)
可以看出,從加入ColorGray后,從ColorCyan開始以及后面的枚舉對應的值都變了。如果各個枚舉的值在代碼中已經hard code了,那這樣的調整將是災難性的。
iota雖然靈活,但似乎有點過于靈活了。
看到這,你以為你已經了解了iota,不,你沒有,它比你想的還要靈活、復雜。
首先來看一道送分題
const (
AA = iota
BB
_
DD
)
問題
此時DD對應的值是多少?
稍稍推理下,顯然不是2,因為中間還多了個下劃線。
沒錯,DD對應的值是3。這里的下劃線"_"表示跳過某值,原本對應在這個位置的值應該是2,但是獲取它不重要,所以使用下劃線跳過了,這個用法也和Go對應下劃線的定義保持一致。
比如遍歷map集合,不需要使用key值時,可以寫成
for _, value := range testMap {
fmt.Println(value)
}
好,再看下一題
const (
AA = iota
BB
_
DD = iota + 1
EE
)
問題
此時DD和EE對應的值是多少?
與上例不同,這里在DD后面重新指定了DD = iota + 1,即在原有的數據上加1,所以此時DD的值為3+1=4。
后面EE沒有重新定義,則也會順延DD的規則遞增1,即5。
如果上面一題你得到了正確的答案,那下面一題也不就不難了。
const (
AA = iota
BB
_
DD = iota + 1
EE
FF = iota + 2
GG = iota
)
問題
此時FF和GG對應的值是多少。
根據上一題,DD和EE分別對應4和5。
首先看這里的FF,注意這里的FF并不是順延EE的值加1,然后再加2,如果是順延則FF = 6 + 2 = 8。但是FF的值是7。
每當某個枚舉被重置(即后面使用iota重新賦值時),則需要從第一個枚舉數到當前的次序,比如這里從AA=0數到FF,此時FF的次序是5,然后再加2,即FF=5+2=7。
GG的值使用上面的方法,得到值為6。
注意:以上是我從結果反推得到的結論,一開始難以理解這里各個枚舉對應的值,找到這個規則后,發現程序跑出來值和規則驗證的一樣。
下面看最后一道題
const (
AA, BB = iota + 1, iota + 2
CC, DD
)
問題
此時的AA、BB、CC和DD對應的值分別是多少
這里只需要明白一個規則,iota是每行才會加一。
所以這里第一行的iota都是0,則AA和BB對應的值分別是0+1=1和0+2=2。
下面的CC和DD都是順延,對應的iota遞增則為1,然后分別按照iota+1和iota+2的運算得到值為1+1 = 2和1+2 = 3。
好了,做完上面不管是送分題還是送命題,我想,你對iota這個小東西算是有一個真正的了解。
個人感覺,功能實現千萬條,看懂再用第一條。
有時候我們使用枚舉,不僅是定義它的值,還需要有對應的描述信息,我們知道這在Java里面是比較方便實現的,畢竟Java本來就有枚舉的概念。
下面我們看看Go實現帶有描述信息枚舉的兩種方式。
使用map映射
const (
ColorRed = iota
ColorOrange
ColorYellow
ColorGrassland
ColorCyan
ColorBlue
ColorPurple
)
var ColorMap = map[int]string{
ColorRed: "赤",
ColorOrange: "橙",
ColorYellow: "黃",
ColorGrassland: "綠",
ColorCyan: "青",
ColorBlue: "藍",
ColorPurple: "紫",
}
這樣,如果想獲取ColorRed對應的描述信息,就可以寫成ColorMap[ColorRed]。
定義枚舉類型
type Color int
const (
ColorRed Color = iota
ColorOrange
ColorYellow
ColorGrassland
ColorCyan
ColorBlue
ColorPurple
)
func (c Color) String() string {
switch c {
case ColorRed:
return "赤"
case ColorOrange:
return "橙"
case ColorYellow:
return "黃"
case ColorGrassland:
return "綠"
case ColorCyan:
return "青"
case ColorBlue:
return "藍"
case ColorPurple:
return "紫"
}
將顏色枚舉定義為Color類型,則所有枚舉值都是該類型,如果要獲取ColorRed對應的描述信息,就可以寫成ColorRed.String()。
以上就是“Go語言中的iota怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。