Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyelesaikan Ralat 'Tidak Dapat Menyimpulkan Jenis Parameter V' Go dalam Fungsi Generik?

Bagaimana untuk Menyelesaikan Ralat 'Tidak Dapat Menyimpulkan Jenis Parameter V' Go dalam Fungsi Generik?

Linda Hamilton
Lepaskan: 2024-12-31 09:26:10
asal
220 orang telah melayarinya

How to Resolve Go's

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)
}
Salin selepas log masuk

Apabila menggunakan fungsi GetValue, pengkompil Go melaporkan ralat:

cannot infer V
Salin selepas log masuk

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")
Salin selepas log masuk

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")
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan