Maison  >  Article  >  développement back-end  >  Pourquoi ne puis-je pas attribuer un récepteur de valeur à une interface avec des méthodes de récepteur de pointeur dans Go ?

Pourquoi ne puis-je pas attribuer un récepteur de valeur à une interface avec des méthodes de récepteur de pointeur dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 04:15:20556parcourir

Why Can't I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Comprendre les types de récepteurs pour la mise en œuvre de l'interface Go

Dans Go, les méthodes peuvent avoir soit des récepteurs de valeur (func (t T) m()) ou des récepteurs de pointeurs (func (t *T) m()) pour les types struct. Le type de récepteur détermine la valeur qui doit être utilisée lors de l'appel de la méthode.

Considérez le code suivant :

import "fmt"

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

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

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 tourGuide = tourGuide{"James"}
    t1.hello() // Hello James
    t1.goodbye() // Goodbye James (same as (&t1).goodbye())

    var t2 *tourGuide = &tourGuide{"Smith"}
    t2.hello() // Hello Smith
    t2.goodbye() // Goodbye Smith (same as (*t2).hello())

    // illegal: t1 is not assignable to g1 (why?)
    // var g1 greeter = t1

    var g2 greeter = t2
    g2.hello() // Hello Smith
    g2.goodbye() // Goodbye Smith
}

Vous vous demandez peut-être pourquoi vous pouvez appeler des méthodes de tourGuide en utilisant soit une variable t1 de type tourGuide ou un pointeur t2 de type *tourGuide, mais vous ne pouvez pas affecter t1 à une variable d'interface g1 de type greeter.

La raison réside dans le récepteur type des méthodes d’interface. Dans ce cas, bonjour et au revoir ont des récepteurs de pointeur. En tant que tel, seule une valeur de pointeur peut être utilisée comme valeur du récepteur.

Lorsque vous appelez t1.hello() et t1.goodbye(), le compilateur prend automatiquement l'adresse de t1 et l'utilise comme récepteur. , car t1 est une valeur adressable.

Cependant, lorsque vous essayez d'attribuer t1 à g1, le compilateur voit que t1 n'est pas une valeur de pointeur, mais une valeur de type guide touristique. Les interfaces ne sont pas adressables, le compilateur ne peut donc pas prendre l'adresse de t1 et l'attribuer à g1.

En résumé, les récepteurs de pointeur nécessitent une valeur de pointeur pour appeler la méthode, tandis que les récepteurs de valeur peuvent être appelés avec une valeur ou un pointeur. Lors de l'implémentation d'interfaces avec des méthodes de réception de pointeur, seules les valeurs de pointeur peuvent être attribuées à l'interface.

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