"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo maneja Go los receptores de puntero y valor en los métodos?

¿Cómo maneja Go los receptores de puntero y valor en los métodos?

Publicado el 2024-11-16
Navegar:544

How Does Go Handle Pointer and Value Receivers in Methods?

Punteros de Go: tipos de receptor y valor

En Go, los punteros son indispensables para comprender la programación orientada a objetos y la gestión de la memoria. Cuando se trata de punteros, es fundamental comprender la distinción entre los tipos de receptores en los métodos.

El ejemplo de Go Tour que proporcionaste ilustra este concepto:

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

Aquí, el método Abs recibe un receptor de puntero (*Vertex). Sin embargo, notaste que también puedes usar un receptor de valores (Vertex) y obtener el mismo resultado. ¿Cómo es esto posible?

Tipos de receptor y valor

Go permite métodos derivados. Un método con un receptor de puntero puede heredar de un método con un receptor de valores. Esto significa que un método receptor de valores, por ejemplo, func (v Vertex) Abs() float64, genera automáticamente un método receptor de puntero:

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

Toma automática de direcciones

Otra característica importante es Go's toma automática de direcciones. Considere el siguiente código sin un receptor de puntero 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 toma implícitamente la dirección del valor pasado al método Abs. Esto es equivalente a lo siguiente:

vp := &v
vp.Abs()

Conclusión

En Go, comprender el papel de los tipos de receptores y la función de toma automática de direcciones es crucial para un uso eficiente del puntero. Puede derivar métodos receptores de punteros a partir de métodos receptores de valores, y Go pasará automáticamente la dirección de los valores sin utilizar punteros explícitamente.

Último tutorial Más>

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