"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 > Estructuras integradas en Go: ¿Cuándo insertar por valor o por puntero?

Estructuras integradas en Go: ¿Cuándo insertar por valor o por puntero?

Publicado el 2024-11-04
Navegar:893

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Estructuras integradas en Go: puntero frente a objeto

Al tratar con receptores de punteros y construir tipos de punteros, comprender la diferencia entre incrustar una estructura como objeto (B) versus un puntero (*B) se vuelve crucial. En este contexto, los valores cero de estos dos tipos de estructuras incrustadas difieren significativamente.

Incrustación directa (objeto)

Si una estructura B con receptores de puntero se incrusta directamente como un objeto dentro de una estructura A, su valor cero incluye un objeto incrustado de tipo B, que a su vez tiene un valor cero. Los desarrolladores pueden acceder de forma segura a este objeto incrustado y sus métodos.

type B struct {
    X int
}

func (b *B) Print() { fmt.Printf("%d\n", b.X) }

type AObj struct {
    B
}

var aObj AObj
aObj.Print() // prints 0

Incrustación de puntero

Por el contrario, incrustar un puntero a B (*B) crea un escenario diferente. El valor cero de esta estructura incrustada tiene un valor de puntero nulo, lo que la vuelve inutilizable directamente.

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

Copia de objetos

Cuando se crea un objeto AObj, obtiene una copia del objeto B incrustado. Las modificaciones realizadas a la copia no afectan el objeto original.

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

Copia del puntero

Con APtr, la creación de un nuevo objeto copia el puntero (*B) pero no el objeto concreto subyacente apuntado a. Por lo tanto, las modificaciones al nuevo objeto afectan tanto al objeto original como al nuevo.

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1

Es importante considerar el caso de uso específico y los requisitos al determinar si se debe incrustar una estructura como un objeto o un puntero. Esta decisión puede afectar la inicialización cero, el comportamiento de copia y la propiedad del objeto, entre otros factores.

Ú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