実は方法があります。しかし、最初にいくつかのことを明確にしましょう。
定数宣言では、型が存在する場合、定数は指定された型を取ります:
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
)
その結果、Stage1
、Stage2
およびの 3 つの新しい定数が生成Stage3
され、すべてタイプが になりFreeStage
ます。
2番目の例:
const (
Stage1 FeeStage = iota // 0
Stage2 = iota + 6 // 7
Stage3 = (iota - 3) * 5 // -5
)
式を省略しなかったため、最初の定数のみStage1
が ( type の) 型付き定数になり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
)