Maison >développement back-end >Golang >Comment Go gère-t-il les appels de méthode avec des récepteurs d'objets lorsque la méthode dispose d'un récepteur de pointeur ?

Comment Go gère-t-il les appels de méthode avec des récepteurs d'objets lorsque la méthode dispose d'un récepteur de pointeur ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 18:47:12490parcourir

How Does Go Handle Method Calls with Object Receivers When the Method Has a Pointer Receiver?

Appels de méthodes avec des récepteurs d'objets ou de pointeurs

Dans Go, les méthodes peuvent être définies pour les types avec des récepteurs de valeur (non-pointeurs) ou un pointeur récepteurs (pointeurs). Lors de l'appel d'une méthode avec un récepteur pointeur par un objet, Go interprète automatiquement l'appel comme s'il était effectué sur un pointeur vers l'objet.

Par exemple, considérons le code suivant :

package main

import (
    "fmt"
    "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) // Calling a method with a pointer receiver using an object
    fmt.Println(v.Abs())
}

Ici, nous avons un type Vertex avec des méthodes de réception de valeur et de pointeur. Dans la fonction principale, nous créons un objet Vertex v puis appelons la méthode Scale dessus. Normalement, la méthode Scale attend un récepteur de pointeur, mais dans ce cas, nous utilisons un objet.

Le compilateur remarque que v est adressable et que son ensemble de méthodes inclut Scale. Selon la spécification Go :

"Un appel de méthode x.m() est valide si l'ensemble de méthodes de (le type de) x contient m et la liste d'arguments peut être affectée à la liste de paramètres de m. Si x est adressable et l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m()."

Par conséquent, l'appel v.Scale(10) est interprété comme (&v).Scale(10), qui transmet effectivement un pointeur vers l'objet v à la méthode Scale. Cela permet à la méthode de modifier les champs X et Y de l'objet comme prévu.

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