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