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.
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