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