Maison > développement back-end > Golang > Pourquoi ne puis-je pas utiliser une variable de type « *T » comme « Stringer » dans Go Generics ?

Pourquoi ne puis-je pas utiliser une variable de type « *T » comme « Stringer » dans Go Generics ?

Mary-Kate Olsen
Libérer: 2024-12-13 01:58:10
original
918 Les gens l'ont consulté

Why Can't I Use a `*T` Type Variable as a `Stringer` in Go Generics?

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!

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