说我有下一个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
来处理这种情况吗?
答案 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
之前插入元素(但不在_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上尝试一下。使用您觉得更容易的那个。