ホームページ >バックエンド開発 >Golang >Go ジェネリックで再帰的な型制約を実現するにはどうすればよいですか?

Go ジェネリックで再帰的な型制約を実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 06:57:44522ブラウズ

How Can I Achieve Recursive Type Constraints in Go Generics?

事前定義された型による再帰型制約

Go ジェネリックでは、インターフェイスを使用してジェネリック型に型制約を指定できます。ただし、ジェネリック型自体の引数を持つメソッドの実装を必要とする制約を定義するのは難しい場合があります。

現在のドラフトの制限事項

Go ジェネリックスの現在のドラフトでは、以下のことが許可されていません。再帰的な型制約により、目的の動作を実現できなくなります。たとえば、次のインターフェイスについて考えてみます。

type Lesser interface {
    Less(rhs Lesser) bool
}

このインターフェイスは、Int などのカスタム型に実装できます。

type Int int

func (lhs Int) Less(rhs Int) bool {
    return lhs < rhs
}

ただし、次のコードはコンパイルに失敗します。 Int は Lesser インターフェイスを満たしていません:

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}

func main() {
    IsLess[Int](Int(10), Int(20))
}

定義済みインターフェイスを使用した解決策

Aこの制限を回避するには、それ自体を型パラメーターとして参照する汎用インターフェイスを定義します。

type Lesser[T any] interface {
    Less(T) bool
}

このインターフェイスでは、Lesser インターフェイスを実装する型には、同じ引数を取る Less メソッドが必要であることを指定します。 type.

次に、この汎用インターフェイスを使用して IsLess 関数を定義できます。

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}

これで、 Lesser 制約を満たすカスタム タイプを実装します:

type Apple int

func (a Apple) Less(other Apple) bool {
    return a < other
}

type Orange int

func (o Orange) Less(other Orange) bool {
    return o < other
}

これらのカスタム タイプで IsLess 関数を使用すると、正しい動作が得られます:

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Orange(30), Orange(15))) // false
}

このソリューションは、次の方法で再帰的な型制約を効果的に強制します。ジェネリック型の引数を持つメソッドの実装が必要です。

以上がGo ジェネリックで再帰的な型制約を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。