Menu
Coddy logo textTech

Struct Gömme Temelleri

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 35 / 107.

Struct gömme, Go'nun bir struct türünü başka bir struct türünün içine dâhil etme mekanizmasıdır. Bir alan adı kullanmak yerine yalnızca türü belirtirsiniz ve Go, gömülü struct'ın alanlarını dış struct'a yükseltir.

İşte temel sözdizimi:

type Address struct {
    City    string
    Country string
}

type Person struct {
    Name string
    Address  // gömülü - alan adı yok
}

Address yapısını Person içine gömdüğünüzde, gömülü alanlara doğrudan dıştaki yapı üzerinden erişebilirsiniz:

func main() {
    p := Person{
        Name: "Alice",
        Address: Address{
            City:    "London",
            Country: "UK",
        },
    }
    
    fmt.Println(p.City)     // London - doğrudan erişim
    fmt.Println(p.Country)  // UK - doğrudan erişim
    fmt.Println(p.Address.City)  // bu da çalışır
}

p.City ifadesinin açıkça p.Address.City yazmadan nasıl çalıştığına dikkat edin. Go, gömülü yapı alanlarını otomatik olarak yükseltir ve bunlara dış yapıya aitlermiş gibi erişilebilmesini sağlar. Gerektiğinde bunlara gömülü tür adı üzerinden yine erişebilirsiniz.

Bu, iç alanlara erişmek için her zaman alan adını kullanmanız gereken normal iç içe yapıtlardan farklıdır. Gömme, ilgili verilerin mantıksal gruplandırılmasını korurken daha düz ve kullanışlı bir API oluşturur.

challenge icon

Görev

Kolay

Temiz ve düzenli bir veri modeli oluşturmak için yapı gömmeyi kullanan bir araç kayıt sistemi oluşturalım. Gömme aracılığıyla tüm alanlara doğrudan erişime izin verirken iletişim bilgilerini araç ayrıntılarından ayıracaksınız.

Kodunuzu iki dosyaya ayıracaksınız:

  • vehicle.go: Gömme aracılığıyla birlikte çalışan iki yapı oluşturun:
    • ContactInfo ve OwnerName alanlarına (her ikisi de string) sahip bir Phone yapısı
    • Vehicle yapısını (alan adı olmadan) gömen ve kendi ContactInfo, Make ve Model alanlarını ekleyen bir Year yapısı
    Ayrıca Summary üzerinde, tüm araç ve iletişim bilgilerini içeren biçimlendirilmiş bir dize döndüren Vehicle adlı bir yöntem oluşturun.
  • main.go: Araç ve sahip ayrıntılarını girdiden okuyun, gömülü Vehicle içeren bir ContactInfo örneği oluşturun ve gömülü alanlara hem doğrudan hem de gömülü tür adı üzerinden erişmeyi gösterin. Sonunda araç özetini yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Sahip adı
  • 2. satır: Telefon numarası
  • 3. satır: Araç markası
  • 4. satır: Araç modeli
  • 5. satır: Yıl (tam sayı)

Summary yönteminiz şu biçimde bir dize döndürmelidir:

[Year] [Make] [Model] - Owner: [OwnerName], Phone: [Phone]

Ana dosyanızda alan yükseltmeyi aşağıdakileri yazdırarak gösterin:

  1. Vehicle üzerinde doğrudan erişilen sahip adı (ör. v.OwnerName)
  2. Gömülü tür üzerinden erişilen telefon (ör. v.ContactInfo.Phone)
  3. Summary yönteminizden alınan tam özet

Örneğin Alice Smith, 555-1234, Toyota, Camry ve 2023 verildiğinde çıktınız şu şekilde olmalıdır:

Alice Smith
555-1234
2023 Toyota Camry - Owner: Alice Smith, Phone: 555-1234

Her iki erişim biçiminin de nasıl çalıştığına dikkat edin: alan yükseltme aracılığıyla doğrudan erişim ve gömülü tür adı üzerinden açık erişim. Bu, gömülü verilerle çalışma şeklinizde esneklik sağlar.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Sahip adını oku
	ownerName, _ := reader.ReadString('\n')
	ownerName = strings.TrimSpace(ownerName)

	// Telefon numarasını oku
	phone, _ := reader.ReadString('\n')
	phone = strings.TrimSpace(phone)

	// Araç markasını oku
	make, _ := reader.ReadString('\n')
	make = strings.TrimSpace(make)

	// Araç modelini oku
	model, _ := reader.ReadString('\n')
	model = strings.TrimSpace(model)

	// Yılı oku
	yearStr, _ := reader.ReadString('\n')
	yearStr = strings.TrimSpace(yearStr)
	year, _ := strconv.Atoi(yearStr)

	// TODO: Gömülü ContactInfo ile bir Vehicle örneği oluştur
	// Yukarıdaki girdiden okunan değerleri kullan

	// TODO: Vehicle üzerinde doğrudan erişilen sahip adını yazdır (alan yükseltme)
	// Örnek: fmt.Println(v.OwnerName)

	// TODO: Gömülü tip adı üzerinden erişilen telefonu yazdır
	// Örnek: fmt.Println(v.ContactInfo.Phone)

	// TODO: Summary metodunu kullanarak tam özeti yazdır
	// Örnek: fmt.Println(v.Summary())

	// Çözümü uyguladıktan sonra bu satırları kaldırın
	_ = ownerName
	_ = phone
	_ = make
	_ = model
	_ = year
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi