İç İçe Geçmiş Struct'lar
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 16 / 107.
İç içe struct, alanlarından biri olarak adlandırılmış başka bir struct içeren bir struct'tır. Bu, daha küçük ve yeniden kullanılabilir türleri bir araya getirerek karmaşık, hiyerarşik verileri modellemeni sağlar.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // iç içe struct
}İç içe geçmiş bir struct içindeki alanlara erişmek için alan adlarını noktalarla zincirlersin.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Bostonİç içe yerleştirme, kodun yeniden kullanılmasını sağlar. Address türü, alanları yinelemeden Person, Company veya Order gibi birden fazla yapıda kullanılabilir. Bu yaklaşım, varlıkların başka varlıkları içerdiği gerçek dünyadaki ilişkileri yansıtır.
type Company struct {
Name string
Employees int
Address Address // aynı Address türü yeniden kullanıldı
}Yapıları birden çok düzeyde iç içe yerleştirebilirsin; ancak hiyerarşileri sığ tutmak okunabilirliği artırır. İç içe yapılar, Go'da nesne yönelimli veri modelleri oluşturmanın temelini oluşturur.
Görev
Kolayİç içe struct'ların gerçek dünyadaki hiyerarşileri modellemeye nasıl yardımcı olduğunu gösteren bir çalışan yönetim sistemi oluşturalım. Çalışanların departmanlara bağlı olduğu ve departmanların konum bilgilerine sahip olduğu bir yapı oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
models.go: Birlikte çalışan üç struct tanımla:Location;Building(string) veFloor(int) alanlarına sahipDepartment;Name(string) ve iç içe birLocationalanına sahipEmployee;ID(int),Name(string) ve iç içe birDepartmentalanına sahip
main.go: Girdiden çalışan bilgilerini oku, iç içe struct'ları doğru şekilde kullanarak bir Employee oluştur ve iç içe yapı üzerinden alanlara erişerek çalışanın profilini eksiksiz biçimde görüntüle.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Çalışan kimliği (tam sayı)
- Satır 2: Çalışanın adı
- Satır 3: Departman adı
- Satır 4: Binanın adı
- Satır 5: Kat numarası (tam sayı)
Çıktı biçimi:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]Örneğin, 101, Alice, Engineering, Tower ve 5 verildiğinde çıktın şöyle olmalıdır:
Employee: Alice (ID: 101)
Department: Engineering
Location: Tower, Floor 5Struct hiyerarşisinde ilerlemek için iç içe alanlara nokta gösterimini kullanarak eriş (ör. employee.Department.Location.Building).
Kendin dene
package main
import "fmt"
func main() {
// Çalışan bilgilerini oku
var id int
var name string
var deptName string
var building string
var floor int
fmt.Scanln(&id)
fmt.Scanln(&name)
fmt.Scanln(&deptName)
fmt.Scanln(&building)
fmt.Scanln(&floor)
// TODO: Uygun şekilde iç içe geçmiş struct'lar ile bir Employee oluşturun
// models.go dosyasındaki Location, Department ve Employee struct'larını kullanın
// Tüm iç içe geçmiş alanları girdi değerleriyle başlatın
// TODO: Çalışan profilini şu formatı kullanarak yazdırın:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// İç içe geçmiş alanlara nokta notasyonu kullanarak erişin (örneğin, employee.Department.Location.Building)
}
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