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

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

Patricia Arquette
Libérer: 2024-12-19 22:24:13
original
546 Les gens l'ont consulté

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

Méthodes de pointeur sur les types non pointeurs

La réponse à une question précédente indique que les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Cependant, cela semble incorrect, comme le démontre le code suivant qui appelle avec succès une méthode pointeur sur une valeur non-pointeur :

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

Explication

Le La clé pour comprendre ce comportement réside dans le fait que le récepteur de la méthode est un pointeur. Lorsque vous appelez c.fourWheels(), la valeur du récepteur, c, n'est pas un pointeur. Cependant, comme le type du récepteur est un pointeur, cela est interprété comme un raccourci pour (&c).fourWheels().

Selon la spécification Go, lors de l'appel d'une méthode, si la valeur du récepteur est adressable et que le Le type de récepteur est un pointeur, l'appel de méthode est interprété comme un appel de méthode pointeur. Dans notre cas, la valeur du récepteur c est adressable et le type de récepteur *car est un pointeur, donc l'appel de méthode c.fourWheels() appelle effectivement (&c).fourWheels().

Ce comportement est cohérent avec l'affirmation selon laquelle les méthodes de valeur peuvent être invoquées sur des pointeurs et des valeurs, tandis que les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Dans le cas des méthodes de pointeur, si la valeur du récepteur n'est pas un pointeur, elle doit être déréférencée pour obtenir une valeur de pointeur pouvant être utilisée comme récepteur.

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!

source:php.cn
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