Go では、型パラメーターを使用してジェネリック インターフェイスを定義すると、次のような問題が発生する可能性があります。実装および使用時の推論の問題。この記事では、このようなシナリオで発生する「V を推論できません: 制約実装から型パラメーターを推論できます」というエラーに対処します。
型パラメーター K および V を持つインターフェイス ConfigStorage を考えます。ここで、V は WritableType を拡張します。 。このインターフェイスのファイル システム ストレージ実装である FileSystemStorage が定義されています。ただし、ジェネリック関数 GetValue を使用しようとすると、V の型を推測できないため、コンパイル エラーが発生します。
Go 1.21 以降:
Go 1.21 以降では、メソッド シグネチャを考慮するように型推論が強化されたため、この問題は解決されました。インターフェース。メソッド シグネチャ内の型パラメーターの型引数は、対応するメソッド内の一致するパラメーターから推測できます。
型制約を指定せずに GetValue を使用するには:
result, _ = GetValue(fileStorage, "key")
1.20 以前を使用:
以前の Go バージョンでは、制約を実装する型からの V の推論はサポートされていません。 GetValue を呼び出すときは、明示的な型パラメータを指定する必要があります:
GetValue[string, string](fileStorage, "key")
関数 GetValue が、指定された引数 (最初の引数、ストレージ) から V の型を推論しようとするため、エラーが発生します。 、およびその 2 番目の引数 key。ただし、ストレージは複数の型を実装する可能性のあるインターフェイス値であるため、これらの引数だけでは V を決定するのに十分な情報が提供されません。
型パラメーターを明示的に指定すると、コンパイラのあいまいさがなくなります。これにより、型推論アルゴリズムが、指定された引数に基づいて V の正しい型を推定できるようになります。
以上がGo ジェネリック インターフェイスで「V を推測できません: 制約実装から型パラメーターを推測できません」を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。