十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
今天小編給大家分享一下Go語言中的iota怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
10年積累的成都網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有新華免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
最近做需求時(shí),有一個(gè)需要枚舉的場景,大概有10+個(gè)枚舉類型,不愿意像定義一個(gè)開關(guān)那樣敷衍的寫成
const (
SwitchOff = 0
SwitchOn = 1
)
顯得不夠精致~
于是想到了iota,深入了解了下,這個(gè)小東西好像有點(diǎn)東西。
再回到需求本身——枚舉。有了iota,就不用顯示定義一大堆數(shù)值了。
未使用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
)
兩者的效果是一樣的,各個(gè)枚舉對(duì)應(yīng)的值也是一樣的。iota是從0開始,每一行都是往下遞增。乍一看,iota還顯得挺高端。
施展威力的同時(shí),iota也有大家詬病的地方。
比如這時(shí)候如果需要添加一個(gè)"灰色"的枚舉類型,在未使用iota版本里面不管在什么位置插入這個(gè)枚舉,定義一個(gè)具體數(shù)值即可,比如對(duì)應(yīng)7。
在使用iota版本里面如果加在ColorPurple后面,對(duì)應(yīng)的值就是7,沒有問題。
但是如果在其他位置,那就會(huì)打破原來的平衡,比如放在ColorGrassland后
const (
ColorRed = iota // 0
ColorOrange // 1
ColorYellow // 2
ColorGrassland // 3
ColorGray // 4
ColorCyan // 5
ColorBlue // 6
ColorPurple // 7
)
可以看出,從加入ColorGray后,從ColorCyan開始以及后面的枚舉對(duì)應(yīng)的值都變了。如果各個(gè)枚舉的值在代碼中已經(jīng)hard code了,那這樣的調(diào)整將是災(zāi)難性的。
iota雖然靈活,但似乎有點(diǎn)過于靈活了。
看到這,你以為你已經(jīng)了解了iota,不,你沒有,它比你想的還要靈活、復(fù)雜。
首先來看一道送分題
const (
AA = iota
BB
_
DD
)
問題
此時(shí)DD對(duì)應(yīng)的值是多少?
稍稍推理下,顯然不是2,因?yàn)橹虚g還多了個(gè)下劃線。
沒錯(cuò),DD對(duì)應(yīng)的值是3。這里的下劃線"_"表示跳過某值,原本對(duì)應(yīng)在這個(gè)位置的值應(yīng)該是2,但是獲取它不重要,所以使用下劃線跳過了,這個(gè)用法也和Go對(duì)應(yīng)下劃線的定義保持一致。
比如遍歷map集合,不需要使用key值時(shí),可以寫成
for _, value := range testMap {
fmt.Println(value)
}
好,再看下一題
const (
AA = iota
BB
_
DD = iota + 1
EE
)
問題
此時(shí)DD和EE對(duì)應(yīng)的值是多少?
與上例不同,這里在DD后面重新指定了DD = iota + 1,即在原有的數(shù)據(jù)上加1,所以此時(shí)DD的值為3+1=4。
后面EE沒有重新定義,則也會(huì)順延DD的規(guī)則遞增1,即5。
如果上面一題你得到了正確的答案,那下面一題也不就不難了。
const (
AA = iota
BB
_
DD = iota + 1
EE
FF = iota + 2
GG = iota
)
問題
此時(shí)FF和GG對(duì)應(yīng)的值是多少。
根據(jù)上一題,DD和EE分別對(duì)應(yīng)4和5。
首先看這里的FF,注意這里的FF并不是順延EE的值加1,然后再加2,如果是順延則FF = 6 + 2 = 8。但是FF的值是7。
每當(dāng)某個(gè)枚舉被重置(即后面使用iota重新賦值時(shí)),則需要從第一個(gè)枚舉數(shù)到當(dāng)前的次序,比如這里從AA=0數(shù)到FF,此時(shí)FF的次序是5,然后再加2,即FF=5+2=7。
GG的值使用上面的方法,得到值為6。
注意:以上是我從結(jié)果反推得到的結(jié)論,一開始難以理解這里各個(gè)枚舉對(duì)應(yīng)的值,找到這個(gè)規(guī)則后,發(fā)現(xiàn)程序跑出來值和規(guī)則驗(yàn)證的一樣。
下面看最后一道題
const (
AA, BB = iota + 1, iota + 2
CC, DD
)
問題
此時(shí)的AA、BB、CC和DD對(duì)應(yīng)的值分別是多少
這里只需要明白一個(gè)規(guī)則,iota是每行才會(huì)加一。
所以這里第一行的iota都是0,則AA和BB對(duì)應(yīng)的值分別是0+1=1和0+2=2。
下面的CC和DD都是順延,對(duì)應(yīng)的iota遞增則為1,然后分別按照iota+1和iota+2的運(yùn)算得到值為1+1 = 2和1+2 = 3。
好了,做完上面不管是送分題還是送命題,我想,你對(duì)iota這個(gè)小東西算是有一個(gè)真正的了解。
個(gè)人感覺,功能實(shí)現(xiàn)千萬條,看懂再用第一條。
有時(shí)候我們使用枚舉,不僅是定義它的值,還需要有對(duì)應(yīng)的描述信息,我們知道這在Java里面是比較方便實(shí)現(xiàn)的,畢竟Java本來就有枚舉的概念。
下面我們看看Go實(shí)現(xiàn)帶有描述信息枚舉的兩種方式。
使用map映射
const (
ColorRed = iota
ColorOrange
ColorYellow
ColorGrassland
ColorCyan
ColorBlue
ColorPurple
)
var ColorMap = map[int]string{
ColorRed: "赤",
ColorOrange: "橙",
ColorYellow: "黃",
ColorGrassland: "綠",
ColorCyan: "青",
ColorBlue: "藍(lán)",
ColorPurple: "紫",
}
這樣,如果想獲取ColorRed對(duì)應(yīng)的描述信息,就可以寫成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 "藍(lán)"
case ColorPurple:
return "紫"
}
將顏色枚舉定義為Color類型,則所有枚舉值都是該類型,如果要獲取ColorRed對(duì)應(yīng)的描述信息,就可以寫成ColorRed.String()。
以上就是“Go語言中的iota怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。