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.
Görev
KolayTemiz 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:ContactInfoveOwnerNamealanlarına (her ikisi de string) sahip birPhoneyapısıVehicleyapısını (alan adı olmadan) gömen ve kendiContactInfo,MakeveModelalanlarını ekleyen birYearyapısı
Summaryüzerinde, tüm araç ve iletişim bilgilerini içeren biçimlendirilmiş bir dize döndürenVehicleadlı bir yöntem oluşturun.main.go: Araç ve sahip ayrıntılarını girdiden okuyun, gömülüVehicleiçeren birContactInfoö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:
- Vehicle üzerinde doğrudan erişilen sahip adı (ör.
v.OwnerName) - Gömülü tür üzerinden erişilen telefon (ör.
v.ContactInfo.Phone) Summaryyö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-1234Her 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
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi