"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 > Como Go lida com receptores de ponteiro e valor em métodos?

Como Go lida com receptores de ponteiro e valor em métodos?

Publicado em 2024-11-16
Navegar:777

How Does Go Handle Pointer and Value Receivers in Methods?

Ponteiros Go: tipos de receptor e valor

No Go, os ponteiros são indispensáveis ​​para a compreensão da programação orientada a objetos e do gerenciamento de memória. Ao lidar com ponteiros, é crucial compreender a distinção entre tipos de receptores em métodos.

O exemplo do Go Tour que você forneceu ilustra este conceito:

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X   v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

Aqui, o método Abs recebe um receptor de ponteiro (*Vertex). Porém, você percebeu que também poderia usar um receptor de valor (Vertex) e obter o mesmo resultado. Como isso é possível?

Tipos de receptor e valor

Go permite métodos derivados. Um método com um receptor de ponteiro pode herdar de um método com um receptor de valor. Isso significa que um método receptor de valor, por exemplo, func (v Vertex) Abs() float64, gera automaticamente um método receptor de ponteiro:

func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) }
func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) }  // GENERATED METHOD

Tomada automática de endereço

Outro recurso importante é o Go's tomada automática de endereço. Considere o seguinte código sem um receptor de ponteiro explícito:

func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) }
func main() {
    v := Vertex{3, 4}
    v.Abs()
}

Go leva implicitamente o endereço do valor passado para o método Abs. Isso é equivalente ao seguinte:

vp := &v
vp.Abs()

Conclusão

No Go, compreender a função dos tipos de receptor e o recurso de obtenção automática de endereço é crucial para o uso eficiente do ponteiro. Você pode derivar métodos receptores de ponteiro a partir de métodos receptores de valor, e Go passará automaticamente o endereço dos valores sem usar ponteiros explicitamente.

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