Métodos Go em tipos de ponteiro: Métodos de chamada com receptor T para tipo de ponteiro *T
Pergunta:
A especificação Go afirma que o conjunto de métodos de um tipo de ponteiro T inclui o conjunto de métodos de seu tipo correspondente T. Isso significa que podemos chamar métodos com receptor T em variáveis do tipo T?
Resposta:
Embora a especificação sugira isso, é importante observar que você não pode chamar diretamente métodos de *T em T. Em vez disso, o compilador desreferencia automaticamente a variável para &T e invoca o método, executando efetivamente (&T).m().
Este comportamento é explicitamente definido no Go especificação:
"Chamadas: Uma chamada de método x.m() é válida se o conjunto de métodos de (o tipo de) x contém m e a lista de argumentos pode ser atribuída à lista de parâmetros de m. Se x for endereçável e o conjunto de métodos de &x contém m, x.m() é uma abreviação de (&x).m() "
Demonstração:
O exemplo a seguir. ilustra este comportamento:
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() }
Apesar de declarar o método SayWat com um receptor *User, podemos invocá-lo no usuário, que é do tipo User. O compilador lida automaticamente com a desreferenciação e as chamadas (&user).SayWat().
Exception:
No entanto, isso se aplica apenas a variáveis endereçáveis. Se você tentar chamar um método de ponteiro em um valor não endereçável, encontrará um erro. Por exemplo:
func aUser() User { return User{} } ... aUser().SayWat() // Error: cannot call pointer method on aUser()
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3