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

atl*_*ine 1 enums const go 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);
}
Run Code Online (Sandbox Code Playgroud)

输出为:

0、1、2、99、100

如果进行中,如何使用a more golang way来处理呢?

实际上,如果我只是想跳过一些值。例如print 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)
}
Run Code Online (Sandbox Code Playgroud)

并且,我也可以使用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)
}
Run Code Online (Sandbox Code Playgroud)

那么,有什么more golang way我需要应对的情况吗?

icz*_*cza 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)
Run Code Online (Sandbox Code Playgroud)

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

0 1 2 99 100
Run Code Online (Sandbox Code Playgroud)

尽管如果在之前插入元素BANANA,则BANANA和以后的常量的值都会改变。

打破不变的群体

如果要避免这种情况,请打破常数组,然后开始一个新的组(只要保留字出现在源中,值iota就会重置为):0const

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

输出是相同的。在Go Playground上尝试一下。

单组,自动偏移

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

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

const (
    APPLE = iota
    ORANGE
    PEAR

    _BREAK

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

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

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

const (
    APPLE = iota
    ORANGE
    PEAR

    _BREAK = iota + 1

    BANANA = iota - _BREAK + 99 // Continues from 99
    GRAPE
)
Run Code Online (Sandbox Code Playgroud)

Go Playground上尝试一下。使用对您而言更简单的方法。