Maison > développement back-end > Golang > le corps du texte

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
Libérer: 2024-11-17 18:27:02
original
584 Les gens l'ont consulté

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

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