Comprendre l'erreur « Impossible d'utiliser une variable de type *T comme type Stringer dans l'argument » dans Go Generics
Dans l'extrait de code fourni, vous essayez d'invoquer de manière générique une fonction do qui attend un paramètre de type stringer, mais vous transmettez un pointeur vers un paramètre de type T à la place.
Le compilateur Go génère une erreur car :
-
Identité de type et paramètres : T n'est pas intrinsèquement équivalent à sa contrainte FooBar. Par conséquent, *T n'est pas la même chose que *FooBar ou *bar.
-
Méthode manquante : L'interface stringer nécessite une méthode nommée a(). Actuellement, vos types foo et bar implémentent cette méthode sur les récepteurs de pointeurs, mais *T ne possède pas intrinsèquement cette méthode.
Résoudre le problème
Il existe deux approches principales pour résoudre ce problème :
1. Affirmer la sécurité des types avec l'assertion de type (moins optimal)
- Affirmer que *T implémente stringer en utilisant any(t).(stringer) dans la fonction do.
- Cette approche peut conduire à la panique si T n'implémente pas réellement le stringer.
2. Redéfinir la contrainte et personnaliser les génériques (préféré)
- Ajouter un stringer comme contrainte à l'interface FooBar.
- Utiliser des récepteurs de pointeur pour les types foo et bar pour s'aligner sur la contrainte .
- Introduire un deuxième paramètre de type qui spécifie la contrainte dans FooBar interface.
- Passez une instance du type contraint comme argument à blah.
Code révisé :
type FooBar[T foo | bar] interface {
*T
stringer
}
func blah[T foo | bar, U FooBar[T]]() {
var t T
do(U(&t))
}
func main() {
blah[foo]()
}
Copier après la connexion
Dans ce code révisé :
- L'interface FooBar inclut un stringer en tant que contrainte.
- Les types foo et bar ont des récepteurs de pointeurs pour leurs méthodes a().
- U est contraint par FooBar[T], garantissant qu'il satisfait à la fois aux contraintes FooBar et stringer.
- blah prend un argument de type U, qui est une instance de l'interface contrainte FooBar.
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!