ホームページ > バックエンド開発 > Golang > Go で汎用のいずれかの型を実装して、どちらかまたは両方の戻り値を処理するにはどうすればよいでしょうか?

Go で汎用のいずれかの型を実装して、どちらかまたは両方の戻り値を処理するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-12-07 13:45:16
オリジナル
258 人が閲覧しました

How Can We Implement a Generic Either Type in Go to Handle Either/Or Return Values?

Go でのジェネリックのいずれかの型の実装

はじめに

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート