Go 1.18 でのジェネリックの導入により、Either 型などのジェネリック データ構造を作成できるようになりました。 2 つの可能な値のいずれかを表すことができます。これは、エラーを処理するための慣用的な Go アプローチのように、値とエラーの両方を返すという制限に対処します。
汎用の Each 型を実装する 1 つのアプローチには、None 型と Optional インターフェイスの利用が含まれます。 None は値がないことを表し、Optional は値またはエラーを取得する方法を提供します。さらに、Left 型と Right 型は、Either が保持できる 2 つの可能な値を表すように定義されています。
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
Either インターフェイスには、左値または右値のどちらを保持するかを決定するメソッドと、両方の型にアクセスするメソッドが用意されています。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
Either インスタンスを作成し、そのインスタンスにアクセスするためのヘルパー関数が提供されています。
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
次の例は、Either タイプの使用法を示しています。
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
出力は次のようになります。
left(4143) right(G4143)
is_left およびis_right メソッドを使用すると、Either が保持する値の型を判断できます。 find_left メソッドと find_right メソッドを使用すると、実際の値を取得できます。
if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
この例では、Either 型を使用して、柔軟かつタイプセーフな方法でさまざまな型の値を表現および処理する方法を示します。
以上がGo のジェネリックスを使用して、柔軟でタイプセーフないずれかの型を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。