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
Barbara Streisandoriginal
2024-12-11 16:57:22569parcourir

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))
}

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 :

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

Déclaration:
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