如何在使用 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
之前插入元素(但不在 _BREAK
和 BANANA
之间),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 上试试这个。使用您认为更容易的那个。
假设我有下一个 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
之前插入元素(但不在 _BREAK
和 BANANA
之间),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 上试试这个。使用您认为更容易的那个。