使用iota定义const变量时如何跳过很多值?

时间:2019-07-16 08:42:55

标签: go enums const iota

说我有下一个c程序:

#include <stdio.h>

int main(int args, char* argv[])
{
    enum RC {
        APPLE=0,
        ORANGE,
        PEAR,
        BANANA=99,
        GRAPE
    };

    printf("%d, %d, %d, %d, %d\n", APPLE, ORANGE, PEAR, BANANA, GRAPE);
}

输出为:

  

0,1,2,99,100

在旅途中,如何使用more golang way来处理此问题?

实际上,如果我只是想跳过一些值。例如打印0, 1, 2, 5, 6,然后我可以使用next跳过一些值,但是这里我需要跳过96个值...

package main

import "fmt"

func main() {
    const (
        APPLE = iota
        ORANGE
        PEAR
        _
        _
        BANANA
        GRAPE
    )
    fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}

而且,我也可以使用下一个,但是在GRAPE之后,我还有很多const变量...

package main

import "fmt"

func main() {
    const (
        APPLE = iota
        ORANGE
        PEAR
        BANANA = 99
        GRAPE  = 100
    )
    fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}

那么,我有more golang way来处理这种情况吗?

1 个答案:

答案 0 :(得分:6)

单个组,手动偏移

您可以将iota转换为常量,并将后续的初始化表达式留空:

const (
    APPLE = iota
    ORANGE
    PEAR
    BANANA = iota + 96 // 96 is manually calculated to get 99
    GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)

这将输出(在Go Playground上尝试):

0 1 2 99 100

尽管如果您在BANANA之前插入元素,BANANA的值和后续常量也会改变。

打破常数组

如果要避免这种情况,请断开常量组,然后重新启动(每次在源中出现保留字iota时,0的值都会重置为const) :

const (
    APPLE = iota
    ORANGE
    PEAR
)
const (
    BANANA = iota + 99 // iota is reset to 0
    GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)

输出是相同的。在Go Playground上尝试这个。

单个组,自动偏移

如果您不想破坏常数组,那么仍然有解决方案。

在要“破坏”编号的位置引入一个常数,并在下一行的iota中减去其值。这将产生1,因此将其移去要减去的值减1。这样,即使您在BANANA之前插入元素(但不在_BREAKBANANA之间插入元素,BANANA的序数和后续常量也不会改变。

const (
    APPLE = iota
    ORANGE
    PEAR

    _BREAK

    BANANA = iota - _BREAK + 98 // Continues from 98 + 1 = 99
    GRAPE
)
fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)

输出再次相同。在Go Playground上尝试一下。

根据您的喜好,_BREAK可能会用iota + 1进行初始化,因此要应用于下一个常量的偏移量将是它获得的值:

const (
    APPLE = iota
    ORANGE
    PEAR

    _BREAK = iota + 1

    BANANA = iota - _BREAK + 99 // Continues from 99
    GRAPE
)

Go Playground上尝试一下。使用您觉得更容易的那个。