Maison > développement back-end > Golang > Comment résoudre l'erreur « Impossible de déduire le paramètre de type V » de Go dans les fonctions génériques ?

Comment résoudre l'erreur « Impossible de déduire le paramètre de type V » de Go dans les fonctions génériques ?

Linda Hamilton
Libérer: 2024-12-31 09:26:10
original
230 Les gens l'ont consulté

How to Resolve Go's

Impossible de déduire le paramètre de type V

Considérez le code Go suivant :

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)
}
Copier après la connexion

Lors de l'appel de la fonction GetValue, le compilateur Go rapporte le erreur :

cannot infer V
Copier après la connexion

Cause

Dans Go 1.20 et versions antérieures, l'algorithme d'inférence de type ne peut pas déduire le type de V uniquement sur la base du stockage et de la clé des arguments fournis. Les règles d'inférence de type contrainte permettent de déduire des arguments de type inconnu à partir d'arguments de type connu. Cependant, dans ce cas, le type concret qui satisfait la contrainte ConfigStorage[K, V] n'est pas connu.

Solution

Pour résoudre ce problème, des paramètres de type explicites doit être fourni lors de l'appel de GetValue :

result, _ = GetValue[string, string](fileStorage, "key")
Copier après la connexion

Go 1.21

Dans Go 1.21, l'algorithme d'inférence de type a été amélioré pour prendre en compte les méthodes lorsqu'une valeur est attribuée à une interface. Cela signifie que les paramètres de type utilisés dans les signatures de méthodes peuvent désormais être déduits des types de paramètres correspondants des méthodes correspondantes. Par conséquent, dans Go 1.21 et versions ultérieures, vous pouvez simplement appeler :

result, _ = GetValue(fileStorage, "key")
Copier après la connexion

sans spécifier explicitement les paramètres de type.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal