私たちが開発するシステム内では、定数値が頻繁に使用されます。これらの値の一例としては、登録ステータスの表現が挙げられます。この場合、アクティブと非アクティブ以外のバリエーションを含むステータスを検討してください。
これらのステータスが文字列として定義されている場合、システム内でのステータスの検証が大きな問題になる可能性があります。さらに、このアプローチでは、各検証に 2 つの文字列 (期待値と検証される値) が含まれるため、バイナリが「インフレート」される可能性があります。
これらの問題を回避するには、よく知られている列挙型を使用できます。このタイプに慣れていない方のために説明すると、これは基本的に固定またはサイズが制限されたタイプです。
わかりやすくするために、いくつかのコードを見てみましょう。前に示したアイデアに従って、登録ステータスを検証する列挙型を作成します。
Go の標準型に基づいて列挙型を作成すると、問題が発生する可能性があります。説明しましょう。ステータスを uint8 型として定義すると想像してください。ここで、システムにジャンル用の uint8 型の別の列挙型があるとします。
ここで、値 1 が保留ステータスとカントリー ミュージック ジャンルの両方を表すと想像してください。 Pending == Country の検証が実行されるとどうなりますか?まさに、true が返されます。
これを防ぐために、ステータスの処理専用に新しい型を作成します。この型は uint8 に基づきますが、別個の型であるため、前述の検証では true が返されません。
type Status uint8
新しい型を定義したら、登録ステータスの定数とそれに対応する値を作成しましょう。
const ( Created Status = 0 Pending = 1 Approved = 2 Rejected = 3 )
上で行ったように値を割り当てることに本質的に問題はありませんが、より簡単な方法があります。各定数に値を割り当てる代わりに、iota キーワード を使用できます。このキーワードにより、Go は最初の定数に 0 を割り当て、後続の定数ごとに値を 1 ずつ順番に増加させます。
const ( Created Status = iota Pending Approved Rejected )
列挙型は現在実装されているため、定数 Created を出力すると値 0 が表示されます。ただし、読みやすくするために、値 0 の代わりに単語 Created を表示する方が便利です。
解決策は非常に簡単です。マジック String() メソッドを実装するだけです。
func (s Status) String() string { switch s { case Created: return "created" case Pending: return "pending" case Approved: return "approved" case Rejected: return "rejected" } return "unknown" }
これをテストするために、保留中ステータスの簡単な出力を実行してみましょう。
package main import "fmt" type Status uint8 const ( Created Status = iota Pending Approved Rejected ) func (s Status) String() string { switch s { case Created: return "created" case Pending: return "pending" case Approved: return "approved" case Rejected: return "rejected" } return "unknown" } func main() { fmt.Println(Pending) }
コマンド go run を実行すると、ターミナルに pending と出力されるはずです。
それだけです!お役に立てば幸いです。
また次回お会いしましょう!
以上がGo で ENUM をマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。