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

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