Go 中的嵌入結構:指標與物件
處理指標接收者與建構指標型時,了解嵌入結構之間的差異因為物件(B) 與指標(*B) 變得至關重要。在這種情況下,這兩個嵌入結構類型的零值顯著不同。
直接嵌入(對象)
如果具有指針接收器的結構B 直接嵌入為結構體A 中的對象,其零值包括類型B 的嵌入對象,該物件本身也具有零值。開發人員可以安全地存取此嵌入物件及其方法。
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
指標嵌入
相反,嵌入指向 B (*B) 的指標會建立不同的場景。此嵌入結構的零值具有 nil 指標值,使其直接無法使用。
type APtr struct {
*B
}
var aPtr APtr
aPtr.Print() // panics
物件複製
當建立 AObj 物件時,它會取得嵌入的 B 物件的副本。副本所做的修改不會影響原始物件。
aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0
指標複製
使用APtr,建立新物件會複製指標(*B),但不會複製所指向的底層具體對像到。因此,對新物件的修改會影響原始物件和新物件。
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1
在決定是將結構體嵌入為物件還是指標時,考慮特定用例和要求非常重要。此決定可能會影響零初始化、複製行為和物件所有權等因素。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3