首頁 >後端開發 >Golang >如何解決 Go 在通用介面中使用類型約束時出現'Cannot Infer V”錯誤?

如何解決 Go 在通用介面中使用類型約束時出現'Cannot Infer V”錯誤?

Patricia Arquette
Patricia Arquette原創
2024-12-13 13:45:11427瀏覽

How Can I Resolve Go's

無法推斷V:從約束實現解析推斷類型參數

目標是在Go 中創建一個支援保存和加載結果的介面在不同的資料庫中,同時支援各種資料類型。

type WritableType interface {
    ~int | ~string | ~float64
}

type ConfigStorage[K, V WritableType] interface {
    get(key K) (V, error)
    set(key K, value V) (bool, error)
}

實作檔案時出現問題系統儲存:

type FileSystemStorage[K, V WritableType] struct {
}

func (f FileSystemStorage[K, V]) get(key K) (V, error) {
    // Code to load data from JSON file
}

func (f FileSystemStorage[K, V]) set(key K, value V) (bool, error) {
    // Code to save data as JSON file
}

呼叫SetValue時,成功。但是,在呼叫GetValue 時,編譯器會遇到錯誤:

cannot infer V

對於Go 1.21 以上版本:

在Go 1.21中,類型推斷得到了改進,可以考慮介面方法中使用的類型。因此,您現在可以在不指定類型參數的情況下呼叫GetValue:

result, _ = GetValue(fileStorage, "key")

對於Go 1.20 及以下版本:

由於當前類型推斷演算法不允許推斷V 從約束實作中,呼叫GetValue 時必須提供明確型別參數:

GetValue[string, string](fileStorage, "key")

以上是如何解決 Go 在通用介面中使用類型約束時出現'Cannot Infer V”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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