中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中的iota怎么使用

發布時間:2022-01-18 10:15:00 來源:億速云 閱讀:146 作者:iii 欄目:數據庫

今天小編給大家分享一下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,不,你沒有,它比你想的還要靈活、復雜。

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怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

都昌县| 东兴市| 重庆市| 台北市| 德庆县| 东阳市| 大港区| 密山市| 洪泽县| 巴林右旗| 伊吾县| 南京市| 时尚| 通河县| 阿合奇县| 驻马店市| 开原市| 抚州市| 赤壁市| 德钦县| 沙湾县| 邮箱| 西乌| 灌阳县| 洪雅县| 咸宁市| 化德县| 胶南市| 澜沧| 云安县| 安庆市| 昌平区| 临桂县| 盐城市| 田阳县| 梅州市| 伊吾县| 嘉荫县| 瓮安县| 朔州市| 营口市|