Встроенные структуры в Go: указатель против объекта
При работе с получателями указателей и созданием типов указателей необходимо понимать разницу между внедрением структуры поскольку объект (B) по сравнению с указателем (*B) становится решающим. В этом контексте нулевые значения этих двух типов встроенных структур существенно различаются. объект внутри структуры A, его нулевое значение включает в себя встроенный объект типа B, который сам имеет нулевое значение. Разработчики могут безопасно получить доступ к этому встроенному объекту и его методам.
type B struct { X целое } func (b *B) Print() { fmt.Printf("%d\n", b.X) } введите AObj struct { Б } вар aObj AObj aObj.Print() // печатает 0
Внедрение указателя
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
type APtr struct { *Б } вар aPtr APtr aPtr.Print() // паника
Копирование объекта
type APtr struct {
*B
}
var aPtr APtr
aPtr.Print() // panics
aObj2 := aObj aObj.X = 1 aObj2.Print() // печатает 0
Копирование указателя
aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0
aPtr.B = &B{} аПтр2 := аПтр aPtr.X = 1 aPtr2.Print() // печатает 1
При определении того, следует ли встраивать структуру в качестве объекта или указателя, важно учитывать конкретный вариант использования и требования. Это решение может повлиять на нулевую инициализацию, поведение копирования и владение объектом, а также на другие факторы.Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3