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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 01:35:10305ブラウズ

How Can I Define a Recursive Type Constraint in Go 2 Generics?

カスタム インターフェイスを使用して再帰型制約を定義する方法

Go2 ジェネリックスでは、インターフェイスを使用してジェネリック型を制約し、特定のメソッドを確実に実装できます。 。ただし、ジェネリック型の引数を持つメソッドの実装を強制することは、現在のドラフトでは許可されていませんでした。

解決策の紹介:

新しいドラフトでは、Lesser インターフェイスと IsLess を定義できるようになりました。 function as:

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

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

このソリューションでは、T が Lesser インターフェイスを実装する型である必要があります。型 T の引数を取る Less メソッドが必要です。制約 T Lesser[T] を定義することで、再帰型制約を作成します。

実際の例:

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
}

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

この例では、カスタム タイプ Apple と Orange はどちらも Lesser 要件を満たしているため、IsLess に渡すことができます。ただし、int を渡したり、型 (Apple と Orange など) を混在させると、型制約によりコンパイル エラーが発生します。

結論:

このソリューションでは、定義されたインターフェイスを使用して再帰的な型制約が可能になります。新しい Go2 ジェネリック ドラフトでは、ジェネリック型とそのメソッド間の複雑な関係を強制できるようになりました。

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

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