Maison  >  Article  >  développement back-end  >  Pourquoi Go renvoie-t-il l'erreur « le type *T est un pointeur vers un paramètre de type, pas un paramètre de type » lors de l'utilisation de génériques ?

Pourquoi Go renvoie-t-il l'erreur « le type *T est un pointeur vers un paramètre de type, pas un paramètre de type » lors de l'utilisation de génériques ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-04 16:46:02170parcourir

Why Does Go Throw the Error

Utilisez les génériques : comprendre les paramètres et les contraintes de type

Cet article explore les subtilités de la raison pour laquelle l'erreur du compilateur "type *T est un pointeur vers un paramètre de type, pas un type paramètre" se produit lors de la tentative de compilation de code impliquant des génériques dans Go.

À propos des paramètres et des contraintes de type

Dans les génériques Go, un paramètre de type représente un espace réservé pour tout type qui satisfait à la contrainte spécifiée. Notamment, la contrainte définit l'ensemble des opérations disponibles sur le paramètre de type, mais elle ne définit pas directement les propriétés d'un type de pointeur dérivé de ce paramètre de type. C'est le nœud du message d'erreur rencontré.

Le message d'erreur expliqué

Le message d'erreur signifie que l'ensemble de méthodes de *T n'inclut pas automatiquement les méthodes de récepteur de pointeur déclarées sur le type concret en cours. contraint. Cela signifie que si l'interface de contrainte nécessite une méthode de récepteur de pointeur, le type concret doit l'implémenter avec un récepteur de pointeur.

Résoudre le problème

Dans l'extrait de code fourni :

  1. Contraintes : Pour résoudre l'erreur "La méthode SetId a un récepteur de pointeur", l'interface GS doit être définie avec un récepteur de pointeur :
<code class="go">type GS interface {
    Id() string
    (*GS) SetId(string)
}</code>
  1. Instanciation : L'instanciation MyStore doit utiliser *A au lieu de A :
<code class="go">var storeA = &MyStore[*A]{}</code>
  1. Modifications de méthode : Modifiez les définitions de méthode dans MyStore en utilisez T au lieu de *T :
<code class="go">type MyStore[T GS] struct {
    values map[string]T
}

func (s *MyStore[T]) add(item T) {...}</code>

En effectuant ces ajustements, le code devient syntaxiquement et sémantiquement correct.

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