Maison  >  Article  >  développement back-end  >  Go Pointers : pourquoi ai-je l'impression que je peux transmettre une valeur ou un pointeur à ma méthode ?

Go Pointers : pourquoi ai-je l'impression que je peux transmettre une valeur ou un pointeur à ma méthode ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-10 13:57:02732parcourir

 Go Pointers: Why Does It Seem Like I Can Pass Either a Value or a Pointer to My Method?

Pointeurs Go : démystifier la sémantique des pointeurs

Les pointeurs sont un concept fondamental de la programmation Go qui permet la manipulation des adresses et des valeurs mémoire par référence. Bien que les pointeurs partagent des similitudes avec d'autres langages de programmation, la sémantique des pointeurs de Go peut être unique et prêter à confusion pour les débutants.

Considérez le code suivant :

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())
}

L'extrait de code définit une structure Vertex et une méthode func (v *Vertex) Abs(), qui calcule la valeur absolue des coordonnées du sommet. En déclarant le récepteur de la méthode comme pointeur *Vertex, nous indiquons que la méthode opère sur un pointeur vers une valeur Vertex.

Si on modifie le code comme suit :

func (v Vertex) Abs() float64 {
    [...]
    v := &Vertex{3, 4}
}

où le récepteur n'est plus un pointeur mais une valeur (Vertex), on obtiendra le même résultat. La raison en est double :

Dérivation de méthode : Go permet la dérivation d'une méthode avec un récepteur de pointeur à partir d'une méthode avec un récepteur de valeur. Cela implique que la méthode func (v Vertex) Abs() génère automatiquement une implémentation de méthode 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

Lorsque vous appelez v.Abs(), où v n'est pas un pointeur, le compilateur trouvera automatiquement et utilisez la méthode générée.

Prise d'adresse automatique : Go a la capacité de prendre automatiquement l'adresse d'une variable. Dans le code ci-dessous :

func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
func main() {
    v := Vertex{3, 4}
    v.Abs()
}

l'expression v.Abs() est équivalente au code :

vp := &v
vp.Abs()

Dans ce scénario, le compilateur prend automatiquement l'adresse de la variable v et le transmet à la méthode du récepteur de pointeur func (v *Vertex) Abs().

Par conséquent, dans le cas des modifications de code que vous avez mentionnées, que vous passiez ou non une valeur ou un pointeur vers la méthode Abs(), la sémantique du pointeur de Go garantit le comportement correct. Cependant, il est généralement considéré comme une bonne pratique d'utiliser des pointeurs lorsque vous travaillez avec des types de référence tels que des structures dans Go.

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