Maison >développement back-end >Golang >Comment puis-je résoudre l'erreur « Impossible d'inférer V » de Go lors de l'utilisation de contraintes de type dans des interfaces génériques ?

Comment puis-je résoudre l'erreur « Impossible d'inférer V » de Go lors de l'utilisation de contraintes de type dans des interfaces génériques ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 13:45:11427parcourir

How Can I Resolve Go's

Impossible de déduire V : résolution du paramètre de type d'inférence à partir de l'implémentation de contraintes

L'objectif est de créer une interface dans Go qui prend en charge l'enregistrement et le chargement des résultats dans différentes bases de données tout en prenant en charge différents types de données.

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

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

Le problème se pose lors de la mise en œuvre d'un système de fichiers stockage :

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
}

Lors de l'appel de SetValue, cela fonctionne avec succès. Cependant, lors de l'appel de GetValue, le compilateur rencontre une erreur :

cannot infer V

Solutions

Pour Go 1.21 et supérieur :

Dans Go 1.21, l'inférence de type a été améliorée pour prendre en compte les types utilisés dans les méthodes d'interface. Par conséquent, vous pouvez désormais appeler GetValue sans spécifier de paramètres de type :

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

Pour Go 1.20 et versions antérieures :

Étant donné que l'algorithme d'inférence de type actuel ne permet pas de déduire V à partir d'une implémentation de contrainte, les paramètres de type explicites doivent être fournis lors de l'appel de GetValue :

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

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!

Déclaration:
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