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
Libérer: 2024-12-02 07:03:10
original
805 Les gens l'ont consulté

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

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

Message d'erreur

cannot call pointer method on aUser()
cannot take the address of aUser()
Copier après la connexion

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal