"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 » ?

Publié le 2024-12-22
Parcourir:294

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 de 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, 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 effectivement (&T).m().

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

"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 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 principal importer ( "fmt" "refléter" ) tapez Structure utilisateur{} func (cet *utilisateur) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } fonction main() { var utilisateur = Utilisateur{} fmt.Println(reflect.TypeOf(utilisateur)) utilisateur.SayWat() }
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 pouvons 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() Utilisateur { renvoyer l'utilisateur{} } ... aUser().SayWat() // Erreur : impossible d'appeler la méthode pointeur sur aUser()
            
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3