«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Встроенные структуры в Go: когда встраивать по значению, а когда по указателю?

Встроенные структуры в Go: когда встраивать по значению, а когда по указателю?

Опубликовано 4 ноября 2024 г.
Просматривать:175

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

Встроенные структуры в 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