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 ?
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) }
Lors de l'appel de la fonction GetValue, le compilateur Go rapporte le erreur :
cannot infer V
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")
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")
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!