İç İç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 geçmiş bir struct, alanlarından biri olarak başka bir adlandırılmış struct içeren bir struct'tır. Bu, daha küçük, yeniden kullanılabilir türleri bir araya getirerek karmaşık, hiyerarşik verileri modellemenize olanak tanır.
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ı nokta kullanarak birbirine bağlarsınız.
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 (nesting), kodun yeniden kullanılabilirliğini teşvik eder. Address türü; alanları yinelemeden Person, Company veya Order gibi birden fazla yapıda (struct) kullanılabilir. Bu yaklaşım, varlıkların diğer varlıkları içerdiği gerçek dünya ilişkilerini yansıtır.
type Company struct {
Name string
Employees int
Address Address // aynı Address türü tekrar kullanıldı
}Struct'ları birden fazla seviye derinliğinde iç içe yerleştirebilirsiniz, ancak hiyerarşileri sığ tutmak okunabilirliği artırır. İç içe geçmiş struct'lar, Go'da nesne yönelimli veri modelleri oluşturmak için temeldir.
Görev
Kolayİç içe geçmiş struct'ların (yapıların) gerçek dünya hiyerarşilerini modellemeye nasıl yardımcı olduğunu gösteren bir çalışan yönetim sistemi kuralım. Çalışanların departmanlara ait olduğu ve departmanların konum bilgilerine sahip olduğu bir yapı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
models.go: Birlikte çalışan üç struct tanımlayın:Building(string) veFloor(int) alanlarına sahipLocationName(string) ve iç içe geçmiş birLocationalanına sahipDepartmentID(int),Name(string) ve iç içe geçmiş birDepartmentalanına sahipEmployee
main.go: Girdiden çalışan bilgilerini okuyun, düzgün şekilde iç içe geçmiş struct'lara sahip bir Employee oluşturun ve iç içe geçmiş yapı üzerinden alanlara erişerek tam çalışan profilini görüntüleyin.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Çalışan ID'si (tam sayı)
- Satır 2: Çalışan adı
- Satır 3: Departman adı
- Satır 4: Bina adı
- Satır 5: Kat numarası (tam sayı)
Çıktı formatı:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]Örneğin, 101, Alice Chen, Engineering, Tower A ve 5 verildiğinde, çıktınız şöyle olmalıdır:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5Struct hiyerarşisi boyunca zincirleme yapmak için nokta notasyonunu kullanarak iç içe geçmiş alanlara erişin (örneğin, employee.Department.Location.Building).
Kopya kağıdı
Bir iç içe geçmiş struct (nested struct), alanlarından biri olarak başka bir isimlendirilmiş struct'ı içeren bir struct'tır; bu, daha küçük ve yeniden kullanılabilir türleri birleştirerek hiyerarşik verileri modellemenize olanak tanır.
İç İçe Geçmiş Struct'ları Tanımlama
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // iç içe geçmiş struct
}İç İçe Geçmiş Alanlara Erişme
Struct hiyerarşisi boyunca zincirleme ilerlemek için nokta notasyonunu kullanın:
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Bostonİç İçe Geçmiş Struct'ları Yeniden Kullanma
Aynı iç içe geçmiş struct türü, birden fazla üst struct genelinde yeniden kullanılabilir:
type Company struct {
Name string
Employees int
Address Address // aynı Address türü yeniden kullanıldı
}İç içe geçmiş struct'lar kodun yeniden kullanılabilirliğini artırır ve varlıkların diğer varlıkları içerdiği gerçek dünya ilişkilerini yansıtır. Struct'ları birden fazla seviye derinliğinde iç içe geçirebilirsiniz, ancak hiyerarşileri sığ tutmak okunabilirliği artırır.
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 Pool