Maison >développement back-end >Golang >Les méthodes Go avec le type de récepteur « T » peuvent-elles être appelées sur des variables de type « *T » ?

Les méthodes Go avec le type de récepteur « T » peuvent-elles être appelées sur des variables de type « *T » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-17 18:27:02679parcourir

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

Méthodes Go sur les types de pointeurs : méthodes d'appel avec le récepteur T pour le type de pointeur *T

Question :

La spécification Go indique que l'ensemble de méthodes d'un type pointeur T inclut l'ensemble de méthodes de son type correspondant T. Cela signifie-t-il que nous pouvons appeler des méthodes avec le récepteur T sur des variables de type T ?

Réponse :

Bien que la spécification le suggère, c'est Il est important de noter que vous ne pouvez pas appeler directement les méthodes de *T sur T. Au lieu de cela, le compilateur déréférence automatiquement la variable vers &T et appelle la méthode, exécutant efficacement (&T).m().

Ce comportement est explicitement défini dans la spécification Go :

"Appels : Un appel de méthode x.m() est valide si l'ensemble de méthodes de (le type de ) x contient m et la liste d'arguments peut être affectée à la liste de paramètres de m Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m(). "

Démonstration :

L'exemple suivant illustre ce comportement :

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

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

func main() {
    var user = User{}

    fmt.Println(reflect.TypeOf(user))

    user.SayWat()
}

Malgré la déclaration de la méthode SayWat avec un récepteur de *User, nous peut l'invoquer sur l'utilisateur, qui est de type User. Le compilateur gère automatiquement le déréférencement et appelle (&user).SayWat().

Exception :

Cependant, cela ne s'applique qu'aux variables adressables. Si vous tentez d'appeler une méthode pointeur sur une valeur non adressable, vous rencontrerez une erreur. Par exemple :

func aUser() User {
    return User{}
}

...

aUser().SayWat() // Error: cannot call pointer method on 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