Maison >développement back-end >Golang >Pourquoi puis-je appeler des méthodes de pointeur sur des valeurs autres que des pointeurs dans Go ?

Pourquoi puis-je appeler des méthodes de pointeur sur des valeurs autres que des pointeurs dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 13:00:18974parcourir

Why Can I Call Pointer Methods on Non-Pointer Values in Go?

Invocation de méthode pointeur sur des valeurs non-pointeur

Dans Go, il est possible d'invoquer des méthodes pointeur sur des valeurs non-pointeur, malgré le règle générale selon laquelle les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Ce comportement apparemment contradictoire peut s'expliquer par le concept de déréférencement automatique du pointeur.

Dans l'extrait de code donné :

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {

    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    fmt.Println("Wheels:", c.wheels)
}

L'expression c.fourWheels() est un raccourci pour (&c) .fourWheels(). En effet, le récepteur de fourWheels est un pointeur et c est une valeur non-pointeur. Puisque c est adressable, le compilateur le déréférence automatiquement pour obtenir un pointeur vers la valeur de la voiture, qui est ensuite utilisée comme récepteur.

Ce comportement est explicitement indiqué dans la spécification Go :

Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m().

Par conséquent, même si la règle générale concernant les méthodes de pointeur reste valable, le déréférencement automatique du pointeur permet l'invocation pratique de méthodes de pointeur sur des valeurs non-pointeurs dans certaines situations. Il est important de noter que ce comportement s'applique uniquement aux méthodes avec des récepteurs de pointeurs.

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