Dans Go, une erreur courante lorsque l'on travaille avec des génériques est "impossible d'utiliser une variable de type *T comme type d'argument" lors de la tentative pour passer un pointeur vers un type générique à une fonction. Cela se produit car le paramètre de type générique T n'est pas équivalent au type de contrainte utilisé pour le restreindre.
Dans le code fourni, l'interface FooBar est définie comme une union de deux types foo et bar. Cela signifie que tout type implémentant la méthode a() string peut être assigné à une interface FooBar. Cependant, le paramètre de type générique T utilisé dans la fonction blah n'est pas implicitement équivalent à FooBar.
De plus, les méthodes des types foo et bar sont implémentées sur les récepteurs de pointeurs (foo et bar). Cela signifie que la chaîne de méthode a() est en fait définie pour les pointeurs vers ces types, pas pour les types eux-mêmes.
Pour résoudre l'erreur, vous devez soit affirmer que le Le paramètre de type générique T implémente l'interface stringer ou définit explicitement l'union des types dans la contrainte elle-même.
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
Cependant, cette approche renonce à la sécurité des types et pourrait conduire à des paniques d'exécution.
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
Cette approche préserve la sécurité des types et permet vous d'initialiser le paramètre de type générique T à une valeur non nulle value.
Comprendre la relation entre les paramètres de type générique et leurs contraintes est crucial pour utiliser efficacement les génériques dans Go. En définissant soigneusement les interfaces et les contraintes, vous pouvez appliquer la sécurité des types et éviter les erreurs d'exécution.
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!