"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Se pueden invocar métodos Go con receptor tipo `T` en variables de tipo `*T`?

¿Se pueden invocar métodos Go con receptor tipo `T` en variables de tipo `*T`?

Publicado el 2024-12-22
Navegar:909

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

Métodos Go en tipos de puntero: métodos de llamada con receptor T para tipo de puntero *T

Pregunta:

La especificación Go establece que el conjunto de métodos de un tipo de puntero T incluye el conjunto de métodos de su tipo T correspondiente. ¿Significa esto que podemos llamar a métodos con el receptor? T en variables de tipo T?

Respuesta:

Si bien la especificación sugiere esto, es importante tener en cuenta que no se pueden llamar directamente métodos de *T en T. En cambio, el compilador desreferencia automáticamente la variable a &T e invoca el método, ejecutando efectivamente (&T).m().

Este comportamiento se define explícitamente en Go especificación:

"Llamadas: una llamada al método x.m() es válida si el conjunto de métodos de (el tipo de) x contiene my la lista de argumentos se puede asignar a la lista de parámetros de m. Si x es direccionable y el conjunto de métodos de &x contiene m, x.m() es la abreviatura de (&x).m() "

Demostración:

El siguiente ejemplo ilustra esto. comportamiento:

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

A pesar de declarar el método SayWat con un receptor de *Usuario, podemos invocarlo en el usuario, que es de tipo Usuario. El compilador maneja automáticamente la desreferenciación y las llamadas (&user).SayWat().

Excepción:

Sin embargo, esto solo se aplica a variables direccionables. Si intenta llamar a un método de puntero en un valor no direccionable, encontrará un error. Por ejemplo:

func aUser() User {
    return User{}
}

...

aUser().SayWat() // Error: cannot call pointer method on aUser()
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3