Maison  >  Article  >  développement back-end  >  Go Pointers : récepteurs de valeur par rapport aux récepteurs de pointeurs - est-ce important ?

Go Pointers : récepteurs de valeur par rapport aux récepteurs de pointeurs - est-ce important ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 17:51:02973parcourir

Go Pointers: Value vs. Pointer Receivers - Does it Matter?

Pointeurs Go : un examen plus approfondi des récepteurs de valeur et de pointeurs

Dans Go, les pointeurs jouent un rôle crucial dans la gestion efficace de la mémoire et la création de ressources réutilisables. structures de données. Les débutants sont souvent aux prises avec le concept de pointeurs, d'autant plus qu'il diffère des langages comme C/C . Cet article vise à clarifier les nuances des pointeurs Go et à répondre aux idées fausses courantes.

Considérez l'extrait de code ci-dessous, emprunté au Go Tour #52 :

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

Ici, nous définissons une structure Vertex, et une méthode Abs qui calcule la valeur absolue d'un sommet. Le récepteur v d'Abs est un pointeur vers Vertex. Cela signifie qu'Abs opère sur des pointeurs vers des sommets, permettant des modifications au sommet d'origine.

Maintenant, considérons une légère modification du code :

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

Fait intéressant, cette modification conduit à le même résultat. Notre question se pose : y a-t-il une différence entre utiliser un *Vertex ou un Vertex comme récepteur pour les Abs ?

La réponse réside dans deux règles fondamentales du Go :

  1. Conversion de récepteur de valeur et de pointeur : Go permet de dériver une méthode avec un récepteur de pointeur à partir d'une méthode avec un récepteur de valeur. Ainsi, func (v Vertex) Abs() float64 génère automatiquement une implémentation supplémentaire :

    func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
    func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) }  // GENERATED METHOD

    Le compilateur trouve de manière transparente la méthode générée, expliquant pourquoi v.Abs() fonctionne toujours même si v n'est pas un pointeur .

  2. Prise d'adresse automatique : Go peut prendre automatiquement l'adresse d'une variable. Cela signifie que lors de l'appel de v.Abs() dans le code modifié sans le récepteur du pointeur, cela équivaut à :

    vp := &v
    vp.Abs()

    Ainsi, la fonction reçoit toujours un pointeur vers le sommet, que nous utilisions explicitement ou non & .

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