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

How to skip a lot of values when define const variable with 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

如果在 go 中,我如何使用 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)
}

而且,我也可以使用 next,但是我在 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可以让我处理这种情况吗?

单组,手动偏移

您可以将 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 和后续常量的值将会改变。

破常组

如果你想避免这种情况,打破常量组,并开始一个新的(每当保留字const出现在iota的值重置为0来源):

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

输出相同。在 Go Playground.

上试试这个

单组,自动偏移

如果不想破解常量组,还是有办法的

在要"break"编号的地方引入一个常量,并在下一行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 上试试这个。使用您认为更容易的那个。