Maison >développement back-end >Golang >Pourquoi les méthodes de pointeur peuvent-elles être appelées sur des valeurs non-pointeurs dans Go ?

Pourquoi les méthodes de pointeur peuvent-elles être appelées sur des valeurs non-pointeurs dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-27 11:49:11773parcourir

Why Can Pointer Methods Be Called on Non-Pointer Values in Go?

Explication des méthodes de pointeur sur les types non pointeurs

Dans Go, la convention stipule que les méthodes de valeur peuvent être invoquées à la fois sur des pointeurs et des valeurs, tandis que les méthodes de pointeur sont limitées aux pointeurs. Cependant, une exception apparente à cette règle est la possibilité d'exécuter des méthodes de pointeur sur des valeurs autres que des pointeurs.

Considérez l'extrait de code suivant :

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()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}

Le code exécute avec succès la méthode de pointeur fourWheels. sur la valeur non pointeur c. Cela peut sembler contradictoire avec la règle établie.

En réalité, lorsque vous invoquez la méthode fourWheels sur la valeur non-pointeur c, vous utilisez une notation abrégée. L'expression c.fourWheels() est équivalente à (&c).fourWheels().

La spécification Go indique : "Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour ( &x).m()."

En d'autres termes, Go déréférence implicitement la valeur non-pointeur c pour obtenir un pointeur vers elle, qui est ensuite utilisé comme récepteur pour le méthode de pointeur.

Pour clarifier la règle sur les méthodes de pointeur, elle doit être interprétée comme suit :

  • Les méthodes de valeur peuvent être invoquées à la fois sur des valeurs et des pointeurs.
  • Les méthodes pointeurs peuvent être invoquées sur des pointeurs et, dans certains cas, sur des valeurs non-pointeurs, mais uniquement si la valeur non-pointeur est accessible indirectement via un pointeur.

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