ホームページ > バックエンド開発 > Golang > ジェネリックとオプションを使用して Go でジェネリックのどちらかの型を実装するにはどうすればよいですか?

ジェネリックとオプションを使用して Go でジェネリックのどちらかの型を実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-24 19:55:25
オリジナル
587 人が閲覧しました

How Can We Implement a Generic Either Type in Go Using Generics and Optionals?

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

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