Struct embedding
- Go kursu
- Başlangıç
- Ders 72/90
- 4 dk
Bir struct'ı başka bir struct içine gömmeyi öğrenirsin.
Struct embedding
Go'da kalıtım yoktur; bunun yerine bir struct başka bir struct'ı gömer (embedding). Gömülen struct'ın alanları ve yöntemleri dıştaki struct üzerinden doğrudan erişilebilir hâle gelir:
type Kisi struct {
Ad string
Yas int
}
type Calisan struct {
Kisi // alan adı yok: gömülü
Departman string
}
c := Calisan{Kisi{"Ada", 36}, "Ar-Ge"}
fmt.Println(c.Ad, c.Departman) // Ada Ar-GeKompozisyon, kalıtım değil
Embedding bir "şudur" (is-a) ilişkisi değil, "şunu içerir" (has-a) ilişkisidir: Calisan, Kisi türünden bir değer yerine kullanılamaz. Aynı ada sahip alanlar varsa dıştaki struct'ınki öncelik kazanır; gömülü olana tam yolla erişilir. Bu açık kural, derin kalıtım hiyerarşilerinin karmaşasını önler.
Uygulama Çalışan kaydı
Kisi (Ad string, Yas int) ve onu gömen Calisan (Departman string) struct'larını yaz. c := Calisan{Kisi{"Ada", 36}, "Ar-Ge"} oluştur, c.Yas++ yap ve c.Ad, c.Yas, c.Departman değerlerini yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Kisi struct {
Ad string
Yas int
}
type Calisan struct {
Kisi
Departman string
}
func main() {
c := Calisan{Kisi{"Ada", 36}, "Ar-Ge"}
c.Yas++
fmt.Println(c.Ad, c.Yas, c.Departman)
}Beklenen çıktı
Ada 37 Ar-Ge
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>c.Ad</code> ile <code>c.Kisi.Ad</code> arasındaki fark nedir?
- c.Ad boş döner
- Yoktur; c.Ad, c.Kisi.Ad'ın kısaltmasıdır Doğru cevap
- c.Ad kopyadır
- c.Kisi.Ad derlenmez
Açıklama: Gömülü alanlar "yükseltilir" (promotion); tam yol olan c.Kisi.Ad de her zaman geçerlidir.
2 Gömülü alan
type Ogretmen struct {
____
Brans string
}
type Ogretmen struct {
Kisi
Brans string
}
Açıklama: Alan adı yazmadan yalnızca tür adı yazmak struct'ı gömer.
3 Kavram
| Kavram | Anlamı |
|---|---|
Embedding |
Has-a ilişkisi |
c.Ad |
Yükseltilmiş alan |
c.Kisi.Ad |
Tam yol |
Kalıtım |
Go'da yok |