Go 1.18 でのジェネリックの出現により、開発者はジェネリック型を作成する可能性について熟考してきました。 [A、B]いずれかのタイプ。この型は、値が型 A または B のいずれかであることを表します。このような型が役立つ状況には、2 つの可能な値 (通常の結果またはエラーなど) のいずれかを返す関数が含まれます。
Go のエラー処理における慣用的なアプローチは、「通常の」値とエラー値の両方を返すことですが、関数が A または B のいずれかを返すことを意図している場合に、A と B の両方を返すことを意味するため、これは意味的に正しくないと主張する人もいます。 B.
Go での Either 型の作成には、そのインターフェイスに 2 つの関数 (型 A 用と型 B 用) を引数として受け入れるメソッドが含まれている必要があるため、課題が生じます。 , Go では、インターフェイス メソッドに型パラメータを持つことは許可されていません。
これを回避するには制限がある場合、1 つのアプローチは、OCaml などの関数型プログラミング言語からソリューションを借用することです。このソリューションでは、値または何も表現しない (つまり None) ことのできる Optional 型を定義します。次に、2 つの Optional 型 (1 つは型 A 用、もう 1 つは型 B 用) をラップする、Either 型を定義します。
type Optional[T any] interface { get() (T, error) } 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 インターフェイスは、値が Left (型 A) であるか、右に (タイプ B)、ラップされた Optional タイプを取得します。 Left 構造体と Right 構造体は、さまざまなケースを表すためにこれらのメソッドを実装します。
ここでは、Either タイプの使用方法の例を示します。
import ( "fmt" "os" ) func main() { var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2) 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) } } }
Inこの例では、2 つのEither 値を作成します。e1 は整数を含む Left であり、e2 は文字列を含む Right です。 is_left() メソッドと is_right() メソッドを使用して、どちらかの値でパターン マッチングを行い、基になる値にアクセスし、それに応じて処理する方法を示します。
以上がGo で汎用のいずれかの型を実装して、どちらかまたは両方の戻り値を処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。