Struct annidate
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 16 di 107.
Una struct annidata è una struct che contiene un'altra struct con nome come uno dei suoi campi. Questo ti permette di modellare dati complessi e gerarchici componendo insieme tipi più piccoli e riutilizzabili.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // struct annidata
}Per accedere ai campi di una struct annidata, concatenare i nomi dei campi con dei punti.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // BostonL'annidamento favorisce il riutilizzo del codice. Il tipo Address può essere utilizzato in più struct come Person, Company o Order senza duplicare i campi. Questo approccio rispecchia le relazioni del mondo reale, in cui le entità contengono altre entità.
type Company struct {
Name string
Employees int
Address Address // stesso tipo Address riutilizzato
}Puoi annidare le struct su più livelli, anche se mantenere le gerarchie poco profonde migliora la leggibilità. Le struct annidate sono fondamentali per creare modelli di dati orientati agli oggetti in Go.
Sfida
FacileCostruiamo un sistema di gestione dei dipendenti che mostri come le struct annidate aiutano a modellare gerarchie del mondo reale. Creerai una struttura in cui i dipendenti appartengono ai reparti e i reparti dispongono di informazioni sulla sede.
Organizzerai il codice in due file:
models.go: definisci tre struct che collaborano tra loro:Locationcon i campiBuilding(string) eFloor(int)DepartmentconName(string) e un campoLocationannidatoEmployeeconID(int),Name(string) e un campoDepartmentannidato
main.go: leggi le informazioni del dipendente dall'input, crea un Employee con struct annidate correttamente e mostra il profilo completo del dipendente accedendo ai campi tramite la struttura annidata.
Verranno forniti i seguenti input:
- Riga 1: ID del dipendente (intero)
- Riga 2: nome del dipendente
- Riga 3: nome del reparto
- Riga 4: nome dell'edificio
- Riga 5: numero del piano (intero)
Formato dell'output:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]Ad esempio, dati 101, Alice Chen, Engineering, Tower A e 5, l'output dovrebbe essere:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5Accedi ai campi annidati usando la notazione con il punto per attraversare la gerarchia delle struct (ad esempio, employee.Department.Location.Building).
Provalo tu
package main
import "fmt"
func main() {
// Leggi le informazioni del dipendente
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: Crea un Employee con struct annidate correttamente
// Usa le struct Location, Department ed Employee di models.go
// Inizializza tutti i campi annidati con i valori di input
// TODO: Stampa il profilo del dipendente usando il formato:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// Accedi ai campi annidati usando la notazione con il punto (ad es., employee.Department.Location.Building)
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP in Go
File esterniWorkspace e moduli GoPacchetti e importazioniNomi esportati e non esportatiIntroduzione all’OOP in GoGli struct come classiDefinire metodi sugli structReceiver con puntatore vs receiver con valoreInizializzazione degli structFunzioni costruttriciRiepilogo - Calcolatrice semplice4Interfacce
Introduzione alle interfacceImplementazione implicitaL’interfaccia come contrattoInterfaccia vuota (any)Asserzione di tipoSwitch sul tipoComposizione di interfacceInterfacce Stringer ed ErrorRipasso - Calcolatore di forme7Incapsulamento
Campi esportati e non esportatiIncapsulamento a livello di packageMetodi Getter e SetterNascondimento delle informazioni in GoRiepilogo - Registri degli studenti10Tipi generici (Go 1.18+)
Introduzione ai tipi genericiParametri di tipoVincoli di tipoStruct genericheSoluzione alternativa per i metodi genericiRiepilogo - Collezione generica13Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello Abstract FactoryModello ObserverModello Strategy2Approfondimento su tipi e struct
Tipi di base e compostiDefinizioni di tipi personalizzatiTag delle structStruct anonimeStruct annidateValori zero e predefinitiRipasso - Rubrica5Composizione invece dell'ereditarietà
Perché Go non ha l'ereditarietàFondamenti dell'embedding delle structPromozione dei metodiEmbedding di più structEmbedding e aggregazione a confrontoMascheramento dei metodi embeddedRiepilogo: gerarchia dei dipendenti8Gestione degli errori e OOP
L'interfaccia errorTipi di errore personalizzatiWrapping degli errori (fmt.Errorf)Errori sentinellaerrors.Is() ed errors.As()Panic, Defer e RecoverRiepilogo - Parser di file11Libreria standard e OOP
io.Reader e io.Writersort.InterfaceInterfaccia fmt.Stringerencoding/json con le structInterfaccia http.HandlerRipasso - modelli REST API14Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeMiddleware come Decorator3Puntatori e memoria
Concetti base dei puntatori in GoPuntatori a structPassaggio per valore vs per riferimentoLa funzione new()Garbage collection in GoRiepilogo - Costruttore di liste concatenate6Polimorfismo in Go
Polimorfismo tramite interfacceDuck typing in GoRegole di soddisfacimento delle interfacceCollezioni polimorficheIniezione delle dipendenzeRiepilogo - Elaboratore di pagamenti9Concorrenza e OOP
Basi delle goroutineCanali e comunicazioneCanali bufferizzati vs non bufferizzatiIstruzione selectsync.Mutex e sync.RWMutexsync.WaitGroupProgettazione di struct thread-safeRiepilogo: worker poolEsercitati da solo: Compilatore Go online