ホームページ > バックエンド開発 > Golang > インターフェイス メソッドのジェネリックスの制限を考慮して、Go でいずれかの型を実装するにはどうすればよいでしょうか?

インターフェイス メソッドのジェネリックスの制限を考慮して、Go でいずれかの型を実装するにはどうすればよいでしょうか?

DDD
リリース: 2024-12-14 03:43:09
オリジナル
267 人が閲覧しました

How Can We Implement an Either Type in Go, Given the Limitations of Generics in Interface Methods?

Go でのどちらかの型の実装: ジェネリックスの境界の移動

問題と目標

ジェネリックスでは、 Go 1.18 の一部であるため、多くの開発者は、複雑なデータを正確に表現する型を作成することに目標を定めています。概念。典型的なケースは「Either[A, B]」タイプで、値が 2 つの異なるタイプ A または B のいずれかである可能性を表します。

インターフェイス定義ハードル

「Either」型のインターフェイスを定義する場合、インターフェイス メソッドで型パラメーターを許可しないという言語の制限により、障害が発生します。この制限により、値のバリアントに基づいて異なる型を返す 'Switch' メソッドを表現できなくなります。

クリエイティブな実装

この問題を克服するには、次のような方法があります。関数型プログラミング言語からインスピレーションを得て、特定の値または不在を表す機能をカプセル化する「Optional」型を実装します。これに基づいて、「Either」タイプを定義できます。

type Either[A, B any] interface {
    is_left() bool
    is_right() bool
    find_left() Optional[A]
    find_right() Optional[B]
}
ログイン後にコピー

このアプローチでは、「Switch」メソッドに依存する代わりに、「is_left」メソッドと「is_right」メソッドを活用して、含まれる価値。 'find_left' メソッドと 'find_right' メソッドは、対応する型の 'Optional' 値を提供します。

実装の詳細と使用法

'Left' と ' 内「Either」を実装する Right の具象型では、実際のペイロードを管理し、必要なブール値フラグを提供します。 「left」関数と「right」関数はコンストラクターとして機能し、インスタンス化を簡素化します。

使用例は、「Either」型の操作方法を示しています。

func main() {
    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)
        } else {
            fmt.Fprintln(os.Stderr, err)
        }
    }
}
ログイン後にコピー

結論

Go の一般的な制限により課題が生じますが、それらを回避して強力な機能を作成することは可能です。 「Either」タイプのような抽象化。 「オプション」を活用し、ヘルパー メソッドを備えたカスタム インターフェイスを実装することで、開発者は Go コードに求める柔軟性と表現力を得ることができます。

以上がインターフェイス メソッドのジェネリックスの制限を考慮して、Go でいずれかの型を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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