Go ジェネリックスでは、インターフェイスを使用して型制約を定義できます。ただし、標準ドラフトでは、型のメソッドがジェネリック型の引数を持つ再帰型制約は許可されていません。
インターフェイス を定義する次のコードを考えてみましょう。 Lesser と関数IsLess:
type Lesser interface { Less(rhs Lesser) bool } func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) }
このコードを実行するとエラーが発生します:
Int does not satisfy Lesser: wrong method signature got func (Int).Less(rhs Int) bool want func (Lesser).Less(rhs Lesser) bool
この問題に対処するには、 Lesser インターフェースと IsLess
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
この定義では、Lesser インターフェイスは型パラメータ T を受け取り、それを受け入れるメソッド Less を宣言します。 T 型の引数。 IsLess 関数は、ジェネリック型 T を制約して、Lesser[T] インターフェイスを実装します。
こちらこのソリューションの使用例:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Apple(20), Orange(30))) // compilation error: type mismatch }
この例では、 Apple 型は、その Less メソッドが Apple 型の引数を受け入れるため、Lesser[Apple] インターフェイスを満たします。 IsLess 関数を使用して、2 つの Apple 値を比較できます。
このアプローチでは、再帰的な型制約が可能になり、型のメソッドに引数があることを強制できます。ジェネリック型の
以上がカスタム インターフェイスを使用して Go ジェネリックで再帰的な型制約を定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。