Snap Together
Birlashtirib ulash
type Engine struct {
Horsepower int
}
type Car struct {
Brand string
Engine // embedded, maydon nomi yo'q!
}
c := Car{Brand: "Tesla", Engine: Engine{Horsepower: 670}}
fmt.Println(c.Horsepower) // 670, ko'tarilgan (promoted)!Embedding — bitta structni ikkinchisining ichiga maydon nomi bermasdan joylashtiradi. Embed qilingan structning maydonlari ko'tariladi (promoted). Ularga to'g'ridan-to'g'ri tashqi struct orqali murojaat qilasiz. c.Engine.Horsepower o'rniga c.Horsepower.
Bu — Go'ning meros olish (inheritance)ga javobi: kompozitsiya. "Car Engine'*dir*" o'rniga, "Car Engine'ga *ega*". Structlarni qurilish bloklaridek birlashtirib ulaysiz. Embed qilingan maydonlar va metodlarning barchasi birga keladi.
Embed qilingan structga aniq murojaat ham qilishingiz mumkin. c.Engine.Horsepower ham ishlaydi. Ikkala yo'l ham bir xil ma'lumotga boradi. Agar tashqi structda bir xil nomli maydon bo'lsa, u embed qilinganini soyalaydi.
>_ Exercise
Street string, City string, Country string maydonlariga ega Address struct'ini aniqlang.
Addressni embed qiladigan va qo'shimcha Name string, Role string maydonlariga ega Employee struct'ini aniqlang.
To'liq to'ldirilgan Employee qaytaradigan NewEmployee(name, role, street, city, country string) Employee funksiyasini yozing.
"Street, City, Country" qaytaradigan (e Employee) FullAddress() string metodini yozing.
Misollar:
- •
e := NewEmployee("Alice", "Engineer", "123 Main St", "Portland", "USA") - •
e.City"Portland"qaytaradi (Address'dan ko'tarilgan!) - •
e.FullAddress()"123 Main St, Portland, USA"qaytaradi
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Embedding sizga meros emas, kompozitsiya beradi. Maydonlar va metodlar ko'tariladi. Ularga to'g'ridan-to'g'ri tashqi struct orqali murojaat qiling.
NEXT UP
Project: Music Catalog (Types)
$ go run main.go
Kodingizni ishga tushiring