Встраивание структур
Комбинируйте структуры
«Встраивание структур» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Композиция структур
В Go нет наследования классов. Вместо этого язык предлагает встраивание: помещайте одну структуру в другую без имени поля, чтобы повторно использовать её поля и методы.
Анонимные поля
Встраиваемое поле объявляется только своим типом, без имени. Его элементы становятся доступными во внешней структуре.
package main
import "fmt"
type Engine struct{ Power int }
type Car struct {
Engine
Brand string
}
func main() {
c := Car{Engine: Engine{Power: 150}, Brand: "Coddy"}
fmt.Println(c.Power, c.Brand)
}Доступ к поднятым полям
Вы напрямую обращаетесь к c.Power, хотя Power принадлежит встроенному Engine. Это и называется продвижением поля.
Полный путь по-прежнему работает
Вы всегда можете явно обратиться к встроенной структуре через имя её типа.
package main
import "fmt"
type Engine struct{ Power int }
type Car struct{ Engine }
func main() {
c := Car{Engine{200}}
fmt.Println(c.Engine.Power)
fmt.Println(c.Power)
}Встраивание и именованное поле
Для именованного поля (engine Engine) требуется c.engine.Power. При встраивании (Engine) элементы продвигаются, поэтому можно написать c.Power. Встраивание выражает отношение «является разновидностью».
Инициализация встроенных структур
Используйте имя типа как ключ поля в составном литерале.
package main
import "fmt"
type Address struct{ City string }
type User struct {
Address
Name string
}
func main() {
u := User{Address: Address{City: "Istanbul"}, Name: "Mert"}
fmt.Println(u.Name, "in", u.City)
}Несколько встраиваний
Структура может встраивать несколько типов, объединяя их поля.
package main
import "fmt"
type Timestamps struct{ Created string }
type Author struct{ Name string }
type Post struct {
Timestamps
Author
Title string
}
func main() {
p := Post{Timestamps{"today"}, Author{"Ada"}, "Hello"}
fmt.Println(p.Title, p.Name, p.Created)
}Конфликты имён
Если у двух встроенных типов есть поле с одним именем, неоднозначная ссылка вызывает ошибку компиляции — для устранения неоднозначности необходимо указать имя типа.
Сокрытие внешней структурой
Поле, объявленное во внешней структуре, скрывает продвинутое поле с тем же именем. При обращении без уточнения используется внешнее поле.
package main
import "fmt"
type Base struct{ ID int }
type Item struct {
Base
ID int
}
func main() {
i := Item{Base{1}, 99}
fmt.Println(i.ID, i.Base.ID)
}Встраивание указателя
Можно встраивать тип-указатель. Его элементы по-прежнему продвигаются, но указатель необходимо инициализировать, иначе возможна ошибка обращения к nil.
package main
import "fmt"
type Logger struct{ Prefix string }
type Service struct{ *Logger }
func main() {
s := Service{Logger: &Logger{Prefix: "[svc]"}}
fmt.Println(s.Prefix)
}Когда использовать встраивание
- Повторно использовать общие поля: временные метки, идентификаторы
- Создавать более содержательные типы из небольших
- Избегать глубокой вложенности и длинных путей доступа
Быстрая проверка
Проверьте свои знания о встраивании структур.
Итоги
Вы изучили встраивание структур.
- Анонимные поля продвигают элементы во внешнюю структуру
- Доступ осуществляется через
c.Powerилиc.Engine.Power - Внешние поля скрывают продвинутые
- При конфликтах требуется явное указание типа
- Встраивание указателей также работает
Часто задаваемые вопросы
Урок «Встраивание структур» бесплатный?
Да — полный текст урока «Встраивание структур» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Встраивание структур»?
Комбинируйте структуры Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Встраивание структур»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Встраивание структур
- Встраивание интерфейсов
- Продвижение методов
- Композиция вместо наследования