Maison >développement back-end >Golang >Pourquoi puis-je appeler une méthode Go avec un récepteur pointeur en utilisant un objet au lieu d'un pointeur ?

Pourquoi puis-je appeler une méthode Go avec un récepteur pointeur en utilisant un objet au lieu d'un pointeur ?

DDD
DDDoriginal
2024-12-28 11:41:21701parcourir

Why Can I Call a Go Method with a Pointer Receiver Using an Object Instead of a Pointer?

Appel d'une méthode destinée à un pointeur avec un objet

En Go, il est possible d'appeler une méthode destinée à un récepteur de pointeur à l'aide d'un objet au lieu d’un pointeur vers lui. Cela peut sembler inhabituel, mais c'est autorisé selon la spécification Go.

Considérez le code suivant :

package main

import "math"

type Vertex struct {
    X, Y float64
}

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

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10) // v is not a pointer to a Vertex object
    fmt.Println(v.Abs())
}

Dans cet exemple, v est un objet de type Vertex, et Scale est une méthode destinée à un pointeur vers Vertex. Cependant, au lieu de passer un pointeur vers v, nous appelons directement v.Scale(10).

Pourquoi ce n'est-il pas une erreur ? La réponse réside dans une règle définie dans la spécification Go pour les appels de méthode :

If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

Cette règle stipule que si la valeur appelée est adressable (c'est-à-dire qu'il s'agit d'une variable locale ou d'un pointeur), alors l'appel une méthode dessus équivaut à appeler la méthode sur son adresse. Dans ce cas, v est une variable locale, donc v.Scale(10) est interprété comme si nous avions écrit (&v).Scale(10) à la place.

Cette commodité nous permet d'écrire plus proprement et plus concis. code sans avoir à créer explicitement un pointeur vers l’objet avant d’appeler la méthode. Cependant, il est important de noter que cela ne fonctionne que pour les méthodes avec récepteurs pointeurs. Pour les méthodes avec des récepteurs de valeurs, le passage d'un pointeur vers l'objet n'est pas autorisé.

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