"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Os métodos Go com receptor do tipo `T` podem ser chamados em variáveis ​​do tipo `*T`?

Os métodos Go com receptor do tipo `T` podem ser chamados em variáveis ​​do tipo `*T`?

Publicado em 2024-12-22
Navegar:911

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

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()
Tutorial mais recente Mais>

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