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

Les méthodes de récepteur de pointeur de Go peuvent-elles être appelées sur des variables non-pointeurs ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-27 21:49:16958parcourir

Can Go's Pointer Receiver Methods Be Called on Non-Pointer Variables?

Méthodes d'appel pour le type de pointeur *T avec le récepteur T

La spécification du langage de programmation Go indique que l'ensemble de méthodes de tout type T se compose de toutes les méthodes avec récepteur de type T. Cependant, l'ensemble de méthodes du type de pointeur correspondant T est l'ensemble de toutes les méthodes avec récepteur T ou T (y compris la méthode ensemble de T).

Cela signifie que nous pouvons appeler des méthodes avec un récepteur de type *T sur une variable de type T, car le compilateur déréférence implicitement la variable pour appeler la méthode.

Pour vérifier ce concept, considérons le code suivant :

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (self *User) SayWat() {
    fmt.Println(self)
    fmt.Println(reflect.TypeOf(self))
    fmt.Println("WAT\n")
}

func main() {
    var user User = User{}

    fmt.Println(reflect.TypeOf(user), "\n")

    user.SayWat()
}

Quand on exécute ce code, on observe que la méthode SayWat() peut être appelée sur la variable utilisateur, même si la méthode est défini avec un récepteur pointeur. En effet, le compilateur déréférence automatiquement la variable pour nous.

Cependant, il est important de noter que nous ne pouvons pas appeler directement les méthodes de *T sur T. Par exemple, le code suivant échouera avec une erreur du compilateur :

func main() {
    var user User = User{}

    (&user).SayWat()
}

Dans ce cas, le compilateur ne peut pas implicitement déréférencer la variable car la méthode SayWat() est définie avec un récepteur de pointeur. Pour appeler la méthode, il faut déréférencer explicitement la variable avec l'opérateur &.

Par conséquent, bien que l'on puisse appeler des méthodes avec un récepteur de type T sur une variable de type T, on ne peut pas appeler des méthodes de T sur T directement.

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