Embedding — это композиция типов. Вместо наследования Go использует встраивание: методы и поля внутреннего типа «поднимаются» на уровень внешнего.
type Logger struct{}
func (l Logger) Log(msg string) { fmt.Println(msg) }
type Server struct {
Logger // embedded — без имени поля
Port int
}
s := Server{Port: 8080}
s.Log("started") // вызываем метод Logger напрямую
Можно встраивать интерфейсы:
type ReadCloser interface {
io.Reader // embedded interface
io.Closer
}
Это НЕ наследование:
- Нет полиморфизма «снизу вверх» (Server != Logger)
- При конфликте имён нужно указывать явно
- Embedded тип не знает о внешнем (нет super/this)