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 ?
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!