質問の背景:
Goの定数は言語の不可欠な部分です。自動番号付けされたグループ定数には、iota識別子が使用されており、最初期のGoバージョンから存在し、論理的に関連する値を宣言するのを簡単にします。
問題:
多くの開発者は、iotaの使い方を誤解し、どのように増加するか、また複雑な宣言パターンでの適用方法を正しく理解できずに間違った値を得てしまいます。これは、簡単なenumに似た構造に対しても不正確な値を引き起こします。
解決策:
iotaを使用すると、連続した定数を宣言し、ビットフラグを便利に積み重ねることができます。各新しい定数グループで0から始まります。新しいconstブロックまたはブロック内の新しい行ごとにiotaの値は増加します。
コードの例:
// iotaを使用したフラグマスクとenumの例 const ( _ = iota // 0をスキップ FlagRead // 1 FlagWrite // 2 FlagExecute // 3 ) const ( ( // ビットフラグ FlagA = 1 << iota // 1 << 0 = 1 FlagB // 1 << 1 = 2 FlagC // 1 << 2 = 4 ) )
主な特性:
iotaはconstブロックの外またはグループ外で定数を宣言する際に増加できますか?
いいえ、iotaはconstグループ内でのみ機能します。単独の宣言の場合、常に値は0です。
const A = iota // 0 const B = iota // 0 (新しいブロック)
グループ内のすべての値がiotaを使用していない場合、どうなりますか?
明示的に指定されたものだけが新しい値を得て、それ以外は前の行の式を取得します。
const ( A = iota // 0 B // 1 C = 10 // 10 D // 10 (iotaではなくCの式を繰り返し) )
iotaを使用してビットマスクを宣言するにはどうすればよいですか?
ビットマスクはシフトを通じて実装します: 1 << iota。
const ( F1 = 1 << iota // 1 F2 // 2 F3 // 4 )
エンジニアは異なるグループでビットフラグを宣言し、iotaがカウンタを続けると考えます:
const ( FlagA = 1 << iota // 1 FlagB // 2 ) const ( FlagC = 1 << iota // 1 – 予想した3ではなく! )
利点:
欠点:
すべての関連定数が1つのグループにまとめられます:
const ( FlagA = 1 << iota FlagB FlagC )
利点:
欠点: