事前定義された型による再帰型制約
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 サイトの他の関連記事を参照してください。