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
Libérer: 2024-12-23 18:47:12
original
515 Les gens l'ont consulté

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

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 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