GoでEnum型を実装する方法
Emily Parker
Product Engineer · Leapcell

はじめに
列挙型は、名前付きの定数値を制限された定義済みセットとして表現するために一般的に使用されるデータ型です。列挙型では、各定数はenum値であり、すべての値は等しく一意です。
列挙型は通常、曜日、月、性別など、関連する定数のセットを表すために使用されます。他の言語(JavaやCなど)では、列挙型は組み込みです。ただし、Goには組み込みの列挙型がないため、同様のenum機能を実装するには他のアプローチを使用する必要があります。この記事では、「列挙型」を実装する方法を説明します。
Goにおける「列挙型」
列挙型の値は本質的に定数であるため、Goの定数を使用して同様のenum機能を実装できます。例:
const ( Sunday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Monday = 7 )
この例では、const
キーワードを使用して定数のグループを定義し、各定数の名前がenumを表し、その値が整数に対応します。
この例はenum型と同様の機能を果たしますが、安全性や制約など、真のenum型の特性がいくつか欠けています。これらの2つの問題に対処するために、カスタム型を使用して改善できます。
type WeekDay int const ( Sunday WeekDay = 1 Tuesday WeekDay = 2 Wednesday WeekDay = 3 Thursday WeekDay = 4 Friday WeekDay = 5 Saturday WeekDay = 6 Monday WeekDay = 7 )
改善された例では、曜日を表すカスタム型WeekDay
を定義します。次に、const
キーワードを使用して定数のグループを定義します。各定数には特定の値が割り当てられ、型強制とチェックのためにWeekDay
型によって制約されます。これにより、enum値名を使用して特定の曜日を表すことができ、カスタム型であるため、コンパイラは型チェックを実行できるため、型安全性が向上します。
iota
を使用して列挙型を優雅に実装する
前の例から、複数のenum値が必要な場合、各enum定数に手動で値を割り当てるのは非常に面倒であることが簡単にわかります。この問題を解決するために、シーケンシャル整数値を生成するiota
定数ジェネレーターを使用できます。
たとえば、iota
を使用してweekday enum型を定義できます。
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
この例では、自動インクリメント定数ジェネレーターiota
を使用して、平日の列挙型を定義します。各enum値はWeekDay
型の定数です。iota
の自動インクリメントルールにより、各enum値は自動的にインクリメントされ、一連の連続する整数値を生成します。
カスタムEnumへのメソッドの追加
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
実装された「enum型」を、Javaなどの他の言語のenumにより近いものにするために、メソッドを追加できます。
Name()
enum値の名前を返します。
// Name returns the name of the enum value func (w WeekDay) Name() string { if w < Sunday || w > Monday { return "Unknown" } return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w] }
Original
enum型内のenum値の位置を返します。
// Original: Since enum values in this type are essentially integer constants, // we can directly use the enum value as its index. func (w WeekDay) Original() int { return int(w) }
String()
書式設定された出力のためにString
メソッドを実装します。
// Converts the enum value to a string for easy output func (w WeekDay) String() string { return w.Name() }
Values()
すべてのenum値を含むスライスを返します。
// Values returns a slice containing all enum values func Values() []WeekDay { return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} }
ValueOf()
名前に基づいて対応するenum値を返します。
// ValueOf uses a switch statement to return the corresponding enum value based on the name func ValueOf(name string) (WeekDay, error) { switch name { case "Sunday": return Sunday, nil case "Monday": return Monday, nil case "Tuesday": return Tuesday, nil case "Wednesday": return Wednesday, nil case "Thursday": return Thursday, nil case "Friday": return Friday, nil case "Saturday": return Saturday, nil default: return 0, fmt.Errorf("invalid WeekDay name: %s", name) } }
まとめ
日々の開発では、列挙型は非常によく使用されます。Goには組み込みのenum型はありませんが、同様の「enum型」を自分で実装することを妨げるものではありません。実装するときは、型の制約と安全性の問題を考慮する必要があります。
enumのような機能を実装する方法はたくさんあります。この記事では、カスタム型を使用したアプローチを紹介しました。コアアイデアを理解すると、構造体またはその他の手法を使用して同様のenum機能を実装することもできます。
Leapcellは、Goプロジェクトをホストするための最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、Redisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金を支払います — リクエストも料金もかかりません。
比類なきコスト効率
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポート。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
ドキュメントで詳細をご覧ください。
Xでフォローしてください:@LeapcellHQ