Tidak Dapat Menyimpulkan Parameter Jenis V
Pertimbangkan kod Go berikut:
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) }
Apabila menggunakan fungsi GetValue, pengkompil Go melaporkan ralat:
cannot infer V
Sebab
Dalam Go 1.20 dan lebih awal, algoritma inferens jenis tidak boleh menyimpulkan jenis V berdasarkan semata-mata pada storan dan kunci argumen yang disediakan. Peraturan inferens jenis kekangan membenarkan untuk menyimpulkan argumen jenis yang tidak diketahui daripada argumen jenis yang diketahui. Walau bagaimanapun, dalam kes ini, jenis konkrit yang memenuhi kekangan ConfigStorage[K, V] tidak diketahui.
Penyelesaian
Untuk menyelesaikan isu ini, parameter jenis eksplisit mesti disediakan semasa memanggil GetValue:
result, _ = GetValue[string, string](fileStorage, "key")
Go 1.21
Dalam Go 1.21, algoritma inferens jenis telah dipertingkatkan untuk mempertimbangkan kaedah apabila nilai diberikan kepada antara muka. Ini bermakna bahawa parameter jenis yang digunakan dalam tandatangan kaedah kini boleh disimpulkan daripada jenis parameter sepadan kaedah padanan. Akibatnya, dalam Go 1.21 dan kemudian, anda boleh memanggil:
result, _ = GetValue(fileStorage, "key")
tanpa menyatakan parameter jenis secara eksplisit.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Tidak Dapat Menyimpulkan Jenis Parameter V' Go dalam Fungsi Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!