我试图为我定义的类型生成一个枚举。
type FeeStage int从这中,我了解到我可以使用iota创建基于这种类型的枚举
const(
Stage1 FeeStage = iota
Stage2
Stage3
)然而,操作枚举的实际值相当麻烦,而且容易出错。
const(
Stage1 FeeStage = iota // 0
Stage2 = iota + 6 // 7
Stage3 = (iota - 3) * 5 // -5
)是否有方法自动将具有自定义值的ENUM列表转换为特定类型。这是我以前使用的,但只将常量的第一个成员转换为自定义类型。
const(
Stage1 FeeStage = 1
Stage2 = 2
Stage3 = 2
)这里是一个有类似结果的游乐场
发布于 2016-03-29 15:48:53
除了使用iota和自动枚举,或者做最简单的事情之外,没有别的办法:
const(
Stage1 FeeStage = 1
Stage2 FeeStage = 2
// or another syntax with same results
Stage3 = FeeStage(2)
)它比做像iota + 5这样的事情要麻烦得多,就像你说的那样,这真的很糟糕。
如果该值在程序上下文之外不重要,则通常使用iota;如果需要在协议或其他方面使用这些值,则使用显式类型。
虽然我不得不说,有时仅仅使用it或字符串就足够了,但这取决于上下文。例如,请参见标准库中的http状态代码。他们没有特殊的类型。
发布于 2016-03-29 15:50:40
您可能应该澄清您实际上想要对枚举常量做什么,但是看起来您正在尝试将任意值赋值到您的自定义类型。
如果要构造常量和要排序的初始化并遵循模式,那么使用iota就不需要麻烦了。有效围棋也有一个关于这个的章节。
您可以为枚举常量创建相当复杂的模式,这不必是容易出错和麻烦的。
发布于 2016-03-29 18:02:43
其实有个办法。但让我们先弄清楚一些事情。
在常量声明中,如果存在类型,则常量将采用指定的类型:
const n int64 = 3 // n will be a typed constant, its type will be int64如果省略类型,则常量将接受表达式的类型:
const x = int16(3) // x will be a typed constant, its type will be int16如果表达式是非类型化常量,则声明的常量将保持非类型化常量:
const i = 1 // i will be an untyped integer constant请注意,如果您试图打印i的类型(例如,使用fmt.Printf("%T", i),您将看到int ),这是因为当将一个常数传递给一个函数或将其赋值给一个变量时,它必须转换为一个实际的类型,并且将使用默认类型(因为fmt.Println()有参数类型的interface{}) --这是一个非类型化整数常量的int。
在括号内的const声明列表中,表达式列表可以从声明中省略(第一个除外)。如果表达式丢失,将使用前面的非空表达式(文本替换)。
所以当你这么做的时候
const(
Stage1 FeeStage = iota
Stage2
Stage3
)它的意思是:
const (
Stage1 FeeStage = iota
Stage2 FeeStage = iota
Stage3 FeeStage = iota
)得到3个新的常数:Stage1、Stage2和Stage3,均为FreeStage型。
你的第二个例子:
const (
Stage1 FeeStage = iota // 0
Stage2 = iota + 6 // 7
Stage3 = (iota - 3) * 5 // -5
)由于您没有省略表达式,所以只您的第一个常量Stage1将是一个类型化常量(类型为FreeStage),其余的将是非类型化常量!因此,这甚至没有资格(不符合您的要求)!
现在你要说的是:你想要这样的东西:
const(
Stage1 FeeStage = 1
Stage2 = 2
Stage3 = 2
)如上所述,如果省略了类型,Stage2和Stage3将是非类型化常量。因此,必须指定类型,您可以利用以下事实:
ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .您可以指定标识符列表。
const(
Stage1, Stage2, Stage3 FeeStage = 1, 2, 2
)这更容易读吗?也许只有几个常量。如果有很多,使用Not_a_高尔夫球手的建议:
const(
Stage1 FeeStage = 1
Stage2 FeeStage = 2
Stage3 FeeStage = 2
)https://stackoverflow.com/questions/36288890
复制相似问题