> Что происходит при именованном встраивании структур и как обращаться к полям и методам при конфликте имен в Go (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: VK

Стек: Go

> Пример ответа

При именованном встраивании структур в Go (например, type B struct { A }) поля и методы встроенной структуры "поднимаются" в объемлющую структуру. Это означает, что к ним можно обращаться напрямую, без указания имени встроенной структуры: b.Field вместо b.A.Field.

При конфликте имен (когда объемлющая и встроенная структуры имеют поля или методы с одинаковыми именами) приоритет имеет имя объемлющей структуры. Доступ к "затененному" полю или методу встроенной структуры возможен только через явное указание имени встроенной структуры: b.A.Field.

Пример:

GO
type A struct {
Name string
}
type B struct {
A
Name string // конфликт с A.Name
}
func main() {
b := B{A: A{Name: "from A"}, Name: "from B"}
fmt.Println(b.Name) // "from B" - поле B.Name
fmt.Println(b.A.Name) // "from A" - явный доступ к A.Name
}

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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью