型パラメータ V を推論できません
次の Go コードを考えてみましょう:
package cfgStorage type WritableType interface { ~int | ~string | ~float64 } type ConfigStorage[K, V WritableType] interface { get(key K) (V, error) set(key K, value V) (bool, error) } func GetValue[K, V WritableType, C ConfigStorage[K, V]](storage C, key K) (V, error) { res, err := storage.get(key) return res, err } func SetValue[K, V WritableType, C ConfigStorage[K, V]](storage C, key K, value V) (bool, error) { res, err := storage.set(key, value) return res, err } type FileSystemStorage[K, V WritableType] struct { } func (f FileSystemStorage[K, V]) get(key K) (V, error) { /// my code to load data from json file } func (f FileSystemStorage[K, V]) set(key K, value V) (bool, error) { /// my code to save data as json file } func main() { var fileStorage cfgStorage.FileSystemStorage[string, string] setResult, _ := cfgStorage.SetValue(fileStorage, "key", "value") if setResult == false { log.Fatal("Error setting value") } var result string result, _ = cfgStorage.GetValue(fileStorage, "key") fmt.Println(result) }
GetValue 関数を呼び出すとき、 Go コンパイラは次のように報告します。 error:
cannot infer V
Cause
Go 1.20 以前では、型推論アルゴリズムは、指定された引数 storage と key のみに基づいて V の型を推定できません。制約型推論ルールを使用すると、既知の型引数から未知の型引数を推定できます。ただし、この場合、ConfigStorage[K, V] 制約を満たす具体的な型は不明です。
解決策
この問題を解決するには、明示的な型パラメーターを使用します。 GetValue を呼び出すときに指定する必要があります:
result, _ = GetValue[string, string](fileStorage, "key")
Go 1.21
Go 1.21 では、値がインターフェイスに割り当てられるときにメソッドを考慮するように型推論アルゴリズムが強化されました。これは、メソッド シグネチャで使用される型パラメータを、一致するメソッドの対応するパラメータ型から推測できることを意味します。その結果、Go 1.21 以降では、型パラメータを明示的に指定せずに、
result, _ = GetValue(fileStorage, "key")
を呼び出すだけで済みます。
以上がジェネリック関数での Go の「型パラメーター V を推論できません」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。