Maison > développement back-end > Golang > Pourquoi le code générique de Go échoue-t-il avec « impossible d'utiliser une variable de type *T comme type dans l'argument » ?

Pourquoi le code générique de Go échoue-t-il avec « impossible d'utiliser une variable de type *T comme type dans l'argument » ?

Barbara Streisand
Libérer: 2024-12-13 20:34:21
original
903 Les gens l'ont consulté

Why Does Go's Generic Code Fail with

Comprendre l'erreur dans le code générique

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.

Comprendre les contraintes de type

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.

Implémentation de méthodes sur les pointeurs

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.

Résoudre l'erreur

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.

Asserting Stringer Implémentation

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}
Copier après la connexion

Cependant, cette approche renonce à la sécurité des types et pourrait conduire à des paniques d'exécution.

Définir explicitement l'union

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}
Copier après la connexion

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.

Conclusion

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!

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