Verschachtelte Structs
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 16 von 107.
Eine verschachtelte Struct ist eine Struct, die eine andere benannte Struct als eines ihrer Felder enthält. Dies ermöglicht es Ihnen, komplexe, hierarchische Daten zu modellieren, indem Sie kleinere, wiederverwendbare Typen miteinander kombinieren.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // verschachteltes Struct
}Um auf Felder in einem verschachtelten Struct zuzugreifen, verketten Sie die Feldnamen mit Punkten.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // BostonVerschachtelung fördert die Wiederverwendung von Code. Der Typ Address kann in mehreren Structs wie Person, Company oder Order verwendet werden, ohne Felder zu duplizieren. Dieser Ansatz spiegelt reale Beziehungen wider, in denen Entitäten andere Entitäten enthalten.
type Company struct {
Name string
Employees int
Address Address // derselbe Address-Typ wiederverwendet
}Sie können Structs über mehrere Ebenen hinweg verschachteln, obwohl flache Hierarchien die Lesbarkeit verbessern. Verschachtelte Structs sind grundlegend für den Aufbau objektorientierter Datenmodelle in Go.
Aufgabe
EinfachLassen Sie uns ein Mitarbeiterverwaltungssystem erstellen, das zeigt, wie verschachtelte Structs dabei helfen, reale Hierarchien abzubilden. Sie werden eine Struktur erstellen, in der Mitarbeiter zu Abteilungen gehören und Abteilungen Standortinformationen haben.
Sie werden Ihren Code in zwei Dateien organisieren:
models.go: Definieren Sie drei Structs, die zusammenarbeiten:Locationmit den FeldernBuilding(string) undFloor(int)DepartmentmitName(string) und einem verschachteltenLocation-FeldEmployeemitID(int),Name(string), und einem verschachteltenDepartment-Feld
main.go: Lesen Sie Mitarbeiterinformationen aus der Eingabe ein, erstellen Sie einen Employee mit korrekt verschachtelten Structs und zeigen Sie das vollständige Mitarbeiterprofil an, indem Sie über die verschachtelte Struktur auf die Felder zugreifen.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Mitarbeiter-ID (Integer)
- Zeile 2: Mitarbeitername
- Zeile 3: Abteilungsname
- Zeile 4: Gebäudebezeichnung
- Zeile 5: Stockwerksnummer (Integer)
Ausgabeformat:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]Zum Beispiel, gegeben 101, Alice Chen, Engineering, Tower A und 5, sollte Ihre Ausgabe wie folgt aussehen:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5Greifen Sie auf die verschachtelten Felder mit der Punktnotation zu, um sich durch die Struct-Hierarchie zu hangeln (z. B. employee.Department.Location.Building).
Spickzettel
Ein verschachteltes Struct (nested struct) ist ein Struct, das ein anderes benanntes Struct als eines seiner Felder enthält. Dies ermöglicht es Ihnen, hierarchische Daten zu modellieren, indem Sie kleinere, wiederverwendbare Typen zusammensetzen.
Verschachtelte Structs definieren
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // verschachteltes Struct
}Zugriff auf verschachtelte Felder
Verwenden Sie die Punktnotation, um sich durch die Struct-Hierarchie zu navigieren:
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // BostonWiederverwendung von verschachtelten Structs
Derselbe verschachtelte Struct-Typ kann in mehreren übergeordneten Structs wiederverwendet werden:
type Company struct {
Name string
Employees int
Address Address // derselbe Address-Typ wird wiederverwendet
}Verschachtelte Structs fördern die Wiederverwendung von Code und spiegeln reale Beziehungen wider, in denen Entitäten andere Entitäten enthalten. Sie können Structs über mehrere Ebenen tief verschachteln, wobei flache Hierarchien die Lesbarkeit verbessern.
Probier es selbst
package main
import "fmt"
func main() {
// Mitarbeiterinformationen lesen
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: Erstelle einen Employee mit korrekt verschachtelten Structs
// Verwende die Structs Location, Department und Employee aus models.go
// Initialisiere alle verschachtelten Felder mit den Eingabewerten
// TODO: Gib das Mitarbeiterprofil in folgendem Format aus:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// Greife auf verschachtelte Felder über die Punktnotation zu (z. B. employee.Department.Location.Building)
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool