Impossible de convertir le paramètre de type générique en type spécifique
Dans Go, lors de l'utilisation de génériques, il est important de comprendre la relation entre les paramètres de type générique et leurs contraintes. Dans ce cas, le problème vient de la tentative de passer un pointeur vers un paramètre de type générique (*T) comme argument à une fonction qui attend une interface spécifique (stringer).
Le message d'erreur explique que *T est un pointeur vers un paramètre de type, mais il n'implémente pas l'interface stringer. En effet, les contraintes de T (FooBar) et de l'interface stringer ne sont pas intrinsèquement connectées. Pour résoudre ce problème, il est nécessaire d'établir une relation entre les deux.
Solution 1 : Affirmer la sécurité du type (non sûr)
Une solution consiste à affirmer que *T est un stringer utilisant any(). Cela vous permet de passer le pointeur comme argument, mais cela sacrifie la sécurité du type et pourrait conduire à des paniques d'exécution.
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
Solution 2 : Paramétrage de FooBar (Type Safe)
Une autre solution consiste à paramétrer l'interface FooBar avec le type générique T, en s'assurant que le paramètre type de FooBar et le paramètre type que vous passez à blah correspondre. Cette approche préserve la sécurité des types et vous permet de passer des pointeurs vers des types spécifiques qui implémentent l'interface stringer.
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
Explication :
Cette solution vous permet de transmettre des instances de types spécifiques qui implémentent l'interface stringer et garantit la sécurité des types lors de l'instanciation.
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!