> Что происходит при именованном встраивании структур и как обращаться к полям и методам при конфликте имен в Go (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: VK
Стек: Go
> Пример ответа
При именованном встраивании структур в Go (например, type B struct { A }) поля и методы встроенной структуры "поднимаются" в объемлющую структуру. Это означает, что к ним можно обращаться напрямую, без указания имени встроенной структуры: b.Field вместо b.A.Field.
При конфликте имен (когда объемлющая и встроенная структуры имеют поля или методы с одинаковыми именами) приоритет имеет имя объемлющей структуры. Доступ к "затененному" полю или методу встроенной структуры возможен только через явное указание имени встроенной структуры: b.A.Field.
Пример:
GOtype A struct {Name string}type B struct {AName string // конфликт с A.Name}func main() {b := B{A: A{Name: "from A"}, Name: "from B"}fmt.Println(b.Name) // "from B" - поле B.Namefmt.Println(b.A.Name) // "from A" - явный доступ к A.Name}
Это правило распространяется и на методы: если объемлющая структура определяет метод с тем же именем, что и у встроенной, то вызывается метод объемлющей структуры. Для вызова метода встроенной структуры необходимо явно указать ее имя.
> Похожие задачи по backend
Что такое CSRF и как определить поддельный запрос
Как работают встраиваемые структуры (embedding) в Go
Является ли select блокирующей конструкцией в Go
Где в памяти находится переменная: в хипе или в стеке в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью