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 :
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]() }
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) }
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!