CodeBlanks Logo Icon CodeBlanks

Struct embedding

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-Ge

Kompozisyon, 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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
type Ogretmen struct {
    ____
    Brans string
}
Cevap
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

Başlangıç bölümündeki tüm dersler