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

Встроенная структура против указателя на структуру: как обстоят дела с нулевыми значениями и копированием?

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

Embedded Struct vs Pointer to Struct: What\'s the Deal with Zero Values and Copying?

Встроенная структура и указатель на структуру: влияние на нулевые значения и копирование

При использовании типа структуры в качестве указателя (т. е. с получателями указателя конструкторы возвращают A и т. д.), выбор между внедрением структуры (как B) или ее указателя (как B) имеет тонкие, но важные последствия.

Нулевые значения

Нулевые значения двух вариантов существенно различаются. Встраивание B напрямую создает внедренный объект с его нулевым значением, что позволяет выполнять с ним немедленные операции:

type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)

Напротив, встраивание *B приводит к нулевому значению с нулевым указателем, что предотвращает прямое использование:

type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)

Копирование

Поведение копирования объекта зависит от типа встраивания. Когда B встроен как объект, при копировании создается новый объект:

type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)

И наоборот, при внедрении указателя (*B) и исходный, и скопированный объекты используют один и тот же базовый объект B, что позволяет синхронизировать изменения:

type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)

Эти различия имеют практическое значение для читаемости кода, удобства сопровождения и оптимизации производительности. Понимая тонкие нюансы внедрения структур и указателей, разработчики могут заранее избежать потенциальных ошибок и использовать наиболее подходящий подход для своих конкретных случаев использования.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3