首頁 >後端開發 >Golang >如何解決 Go 在泛型函數中出現「無法推斷型別參數 V」錯誤?

如何解決 Go 在泛型函數中出現「無法推斷型別參數 V」錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-31 09:26:10220瀏覽

How to Resolve Go's

無法推斷型別參數 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn