Maison > développement back-end > Golang > Pourquoi les structures Go Structs avec des récepteurs de valeur ne peuvent-elles pas remplir les interfaces avec des récepteurs de pointeurs ?

Pourquoi les structures Go Structs avec des récepteurs de valeur ne peuvent-elles pas remplir les interfaces avec des récepteurs de pointeurs ?

Patricia Arquette
Libérer: 2024-12-04 01:40:11
original
580 Les gens l'ont consulté

Why Can't Go Structs with Value Receivers Fulfill Interfaces with Pointer Receivers?

Pourquoi les variables Struct Go ne peuvent-elles pas implémenter d'interfaces avec des récepteurs de pointeurs ?

Dans Go, les méthodes struct peuvent avoir soit des récepteurs de valeur (qui fonctionnent sur la valeur de la structure directement) ou des récepteurs de pointeurs (qui fonctionnent sur un pointeur vers la structure). Lors de l'implémentation d'interfaces, il existe des restrictions subtiles sur les types qui peuvent satisfaire l'interface en fonction du type de récepteur des méthodes d'interface.

Considérez le code suivant :

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}
Copier après la connexion

Nous pouvons définir des méthodes avec récepteurs de valeur et de pointeur pour tourGuide :

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}
Copier après la connexion

Maintenant, voici la clé différence :

  • Les variables ou les copies de tourGuide peuvent appeler à la fois les méthodes de réception de valeur et de pointeur :

    var t1 tourGuide = tourGuide{"James"}
    t1.hello()   // works
    t1.goodbye() // works
    Copier après la connexion
  • Cependant, les variables d'interface ne peuvent être attribué à partir de types pouvant implémenter toutes les méthodes d'interface avec le même type de récepteur que l'interface lui-même :

    var g2 greeter = &t2 // works because *tourGuide implements greeter's pointer receiver methods
    
    // illegal: t1 is not assignable to g1
    // var g1 greeter = t1 // error: cannot use tourGuide as type greeter in assignment because tourGuide does not implement greeter (hello method has value receiver)
    Copier après la connexion

Alors, pourquoi t1 ne peut-il pas implémenter l'interface greeter ?

La raison est que la méthode hello() dans l'interface greeter a un récepteur de pointeur, ce qui signifie qu'il attend un pointeur vers une valeur tourGuide en tant que récepteur. Cependant, t1 est une variable (pas un pointeur). Même si les variables de valeur sont adressables, les valeurs d'interface contiennent des copies des valeurs stockées, pas des références. Par conséquent, lors de l'attribution d'une variable de valeur à une variable d'interface, cela crée une nouvelle copie qui ne peut pas être déréférencée et transmise en tant que récepteur pour les méthodes de récepteur de pointeur.

En résumé, lors de l'implémentation d'interfaces avec des méthodes de récepteur de pointeur, seuls les pointeurs au type d’implémentation peut satisfaire l’interface. Les variables ou copies de valeur ne sont pas attribuables à de telles interfaces car elles ne peuvent pas fournir le type de récepteur de pointeur requis.

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