無法推斷型別參數 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編譯器報告錯誤:
cannot infer V
原因
在Go 1.20 及更早版本中,類型推斷演算法無法僅根據提供的參數儲存和鍵來推斷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中文網其他相關文章!