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