其实是有办法的。但让我们先弄清楚一些事情。
在constant declarations中,如果类型存在,则常量将采用指定的类型:
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 将是无类型常量。所以必须指定类型,你可以利用 const 规范是:
ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
您可以指定一个标识符列表:
const(
Stage1, Stage2, Stage3 FeeStage = 1, 2, 2
)
这更具可读性吗?也许如果只有几个常数。如果有很多,请使用 Not_a_Golfer 的推荐:
const(
Stage1 FeeStage = 1
Stage2 FeeStage = 2
Stage3 FeeStage = 2
)