Go ジェネリックでの共用体制約のメソッドの呼び出し
Go ジェネリック (v1.18) では、制限を制限する型共用体制約が発生する可能性があります。パラメータの型を、統一インターフェイスを実装する型に変更します。ただし、制約された型間で共有メソッドを呼び出すことができないため、そのような制約の有用性について懸念が生じます。
次のコードを考えてみましょう:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool { return true } func (b *B) some() bool { return false } func some[T AB](x T) bool { return x.some() } // Compiler error
コンパイラ エラー「x.some unknown」これは、型共用体制約 *A | が存在するためです。 *B は、*A と *B の両方にメソッドが存在することを保証しません。
この問題を解決するには、インターフェイス制約にメソッドを追加できます。
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
これT は、*A または *B の両方を実装し、メソッドを宣言する型に制限されます。
ただし、この解決策は、型共用体で理想的に機能するものに対する回避策と見なされます。 一人で。 Go 1.18 には現在、メソッド m が P の制約インターフェイスによって明示的に宣言されている場合にのみ、コンパイラが型パラメーター P の値に対するメソッドの呼び出しをサポートするという制限があります。言語仕様では、インターフェイスのメソッド セットは、インターフェイスの型セット内の各型のメソッド セットの共通部分であると述べられています。この問題は Go 1.19 で解決される予定です。
以上がGo ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。