Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-11-10 13:57:02
original
731 Les gens l'ont consulté

 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())
}
Copier après la connexion

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}
}
Copier après la connexion

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
Copier après la connexion

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()
}
Copier après la connexion

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

vp := &v
vp.Abs()
Copier après la connexion

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!

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