Maison > développement back-end > Golang > Comment convertir en toute sécurité un pointeur de type générique en une interface spécifique dans Go ?

Comment convertir en toute sécurité un pointeur de type générique en une interface spécifique dans Go ?

Barbara Streisand
Libérer: 2024-12-11 16:57:22
original
572 Les gens l'ont consulté

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

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))
}
Copier après la connexion

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))
}
Copier après la connexion

Explication :

  • Les contraintes de T sont maintenant foo ou bar, et FooBar est paramétré avec T.
  • Vous pouvez créer un pointeur vers un type spécifique (par exemple, *foo) et transmettez-le à blah, ce qui instanciera FooBar avec le type correspondant.
  • La conversion U(&t) est maintenant valide car U et le pointeur vers T ont le même type défini.

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!

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