Maison > développement back-end > Golang > Comment puis-je résoudre l'erreur « Impossible d'utiliser une variable de type *T comme stringer de type » dans Go Generics ?

Comment puis-je résoudre l'erreur « Impossible d'utiliser une variable de type *T comme stringer de type » dans Go Generics ?

Linda Hamilton
Libérer: 2024-12-20 15:22:10
original
989 Les gens l'ont consulté

How Can I Resolve the

Considérations sur la sécurité des types dans les génériques

Dans les génériques de Go, le paramètre de type T est distinct de l'interface de contrainte FooBar. Cependant, cette distinction soulève une question : comment passer une instance de T à une fonction attendant un type qui implémente stringer (comme do) ?

Comprendre l'erreur

Le message d'erreur "Impossible d'utiliser une variable de type *T comme type stringer dans l'argument à faire" suggère que le paramètre t de blah est identifié à tort comme un type qui implémente stringer. Cependant, T ne possède pas intrinsèquement cette méthode.

Résolution du problème

Pour activer la conversion de t en longeron, les étapes suivantes sont nécessaires :

  1. Introduire l'interface stringer à FooBar : Ajouter stringer à la contrainte FooBar, permettant à tous les types qui satisfont FooBar pour avoir une méthode stringer.
  2. Modifiez les types dans l'union : Modifiez la contrainte FooBar pour accepter les pointeurs vers foo ou bar, car le type de stringer du récepteur est un pointeur .
  3. Déclarer les littéraux composites comme pointeurs : Puisque vous ne pouvez pas déclarer de littéraux composites sur les contraintes sans type de base, vous devez déclarer t comme type de pointeur.
  4. Introduire un paramètre de type pour FooBar : Extrayez l'union de type de FooBar dans un nouveau paramètre de type pour vous assurer que U et T ont des jeux de caractères compatibles.

Final Code

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

func blah[T foo | bar, U FooBar]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}
Copier après la connexion

Explication

Maintenant, lorsque blah est appelé, une variable t de type T est déclarée comme pointeur. FooBar[T] contraint U à être un type qui contient un pointeur vers T. La conversion de &t en U est valide et les méthodes de FooBar[T] (qui incluent le stringer) sont disponibles pour le récepteur t.

Remarque :

L'utilisation de paramètres de type pour FooBar permet de transmettre des arguments et supprime le besoin de supercheries intermédiaires. Par exemple, vous pouvez modifier blah en :

func blah[T FooBar](t T) {
    do(t)
}
Copier après la connexion

Et l'appeler avec blah(&foo{}).

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