Maison >développement back-end >Golang >Pourquoi Go déréférence-t-il implicitement lors de l'appel de méthodes de récepteur de pointeur ?

Pourquoi Go déréférence-t-il implicitement lors de l'appel de méthodes de récepteur de pointeur ?

DDD
DDDoriginal
2024-12-02 07:03:10864parcourir

Why Does Go Implicitly Dereference When Calling Pointer Receiver Methods?

Ensembles de méthodes Go : appel de méthodes pour les types de pointeurs et le récepteur

Un aspect souvent discuté des ensembles de méthodes Go survient lors de la tentative d'appel méthodes avec récepteur de type T sur des variables de type T. La spécification Go indique que l'ensemble de méthodes de T comprend à la fois les méthodes avec récepteur tapez *T et ceux avec le type de récepteur T.

Inférences contradictoires

Cependant, l'exemple suivant démontre que cette inférence peut sembler contre-intuitive :

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()
}

Inférence du compilateur

Le compilateur déduit que user.SayWat() appelle la méthode avec le type de récepteur *T, bien que la variable user soit de type T. Ce comportement est dû à l'insertion automatique par le compilateur de &, l'opérateur d'adresse de. Essentiellement, il réécrit l'appel à (&user).SayWat().

Méthodes d'appel pour les types de pointeurs

Il est important de clarifier que même s'il apparaît que les méthodes pour les types pointeurs sont appelées sur des variables de type T, ce n'est pas strictement vrai. Le compilateur utilise un récepteur de type *T, et le déréférencement de &user vers T est une opération implicite.

Exceptions au déréférencement implicite

Cependant, cette opération implicite le déréférencement ne s’applique pas dans tous les cas. L'appel d'une méthode avec un récepteur de pointeur sur une valeur de retour (non adressable) entraînera une erreur de compilation, telle que :

func aUser() User {
    return User{}
}

...

aUser().SayWat()

Message d'erreur

cannot call pointer method on aUser()
cannot take the address of aUser()

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