Embedding là khai báo một field không có tên, chỉ có kiểu.
Field và method của kiểu được nhúng được thăng cấp (promote) lên struct ngoài, gọi trực tiếp như của chính nó.
type Base struct{ ID int }
func (b Base) Describe() string { return fmt.Sprintf("id=%d", b.ID) }
type User struct {
Base // embedded, không có tên field
Name string
}
u := User{Base: Base{ID: 7}, Name: "an"}
fmt.Println(u.ID) // 7 — thăng cấp từ Base
fmt.Println(u.Describe()) // id=7
fmt.Println(u.Base.ID) // vẫn truy cập tường minh đượcKhông phải kế thừa. Đây là composition cộng đường tắt cú pháp:
- Không có đa hình theo kiểu cha: Base.Describe gọi trên u vẫn chỉ thấy phần Base, không biết gì về User.
- Không có override thật; nếu User khai báo Describe riêng thì method ngoài che (shadow) method trong, muốn dùng bản cũ phải gọi u.Base.Describe().
- Có thể embed interface để mượn phần cài đặt, ví dụ nhúng http.ResponseWriter để chỉ override đúng method cần.
Nếu hai kiểu nhúng cùng có method trùng tên ở cùng độ sâu, lời gọi sẽ lỗi biên dịch do nhập nhằng — phải chỉ rõ đường dẫn.