Go でのジェネリックのどちらかの型の実装
Go 1.18 では、ジェネリックは複雑な概念を表現するための有望な可能性を提供します。そのような概念の 1 つが、型 A または型 B のいずれかの値を表すことができる、Either 型です。この記事では、Go の新しいジェネリック パラダイム内で、Either 型を実装する潜在的な方法を検討します。
この課題は、Go の制限から生じます。型パラメータを持たないインターフェイス メソッド。このハードルにより、Either インターフェイスの直接実装が妨げられます。
Optional を使用して Either をエミュレートする
1 つのアプローチは、Option の関数型プログラミングの概念を適応させることです。 Optional[T] インターフェイスは、タイプ T の値、または値の不在を表すことができます。 Go のジェネリックスを活用することで、このアイデアを拡張して、A または B のいずれかのオプションを作成できます。
type Optional[T any] interface { get() (T, error) } func CreateNone[T any]() Optional[T] { return None[T]{} } func CreateSome[T any](data T) Optional[T] { return Some[T]{data} }
いずれかの実装
オプションが確立されると、次のことが可能になります。それを利用するEither型を構築します。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
LeftとRightの構造体は値を表しますそれぞれタイプAとBです。 is_left と is_right は、Either がどのタイプを保持するかを示します。 find_left と find_right は、それぞれの値のオプションのラッパーを提供します。
type Left[A, B any] struct { data A } func left[A, B any](data A) Either[A, B] { return Left[A, B]{data} } type Right[A, B any] struct { data B } func right[A, B any](data B) Either[A, B] { return Right[A, B]{data} }
使用法
実装されたどちらのタイプも次のように利用できます:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } }
このアプローチは、Go のインターフェース制約を尊重しながら、Either タイプを効果的にエミュレートします。これにより、2 つの型のいずれかに属する値の表現が可能になり、Go コードの柔軟性と型安全性が向上します。
以上がジェネリックとオプションを使用して Go でジェネリックのどちらかの型を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。