Ripasso - Rubrica
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 18 di 107.
Sfida
FacileCostruiamo un sistema di rubrica che riunisca tipi personalizzati, struct annidate, tag delle struct e valori zero: tutti i concetti che hai imparato in questo capitolo.
Organizzerai il codice in due file:
contact.go: definisci il modello dei dati della rubrica con tipi personalizzati significativi e una formattazione JSON appropriata:- Crea i tipi personalizzati
PhoneeEmailbasati sustringper rendere il codice autoesplicativo - Definisci una struct
Addresscon i campiStreet,CityeCountry, ciascuno con i tag JSON appropriati - Definisci una struct
Contactche contengaName(string),Phone(il tuo tipo Phone),Email(il tuo tipo Email) eAddress(struct annidata). Usa i tag JSON per ometterephoneeemailse sono vuoti
- Crea i tipi personalizzati
main.go: leggi le informazioni del contatto dall'input, crea un'istanza di Contact e stampala come JSON formattato. Alcuni contatti potrebbero avere informazioni incomplete: lascia che i valori zero eomitemptyle gestiscano correttamente.
Verranno forniti i seguenti input:
- Riga 1: nome del contatto
- Riga 2: numero di telefono (può essere vuoto)
- Riga 3: indirizzo email (può essere vuoto)
- Riga 4: indirizzo stradale
- Riga 5: città
- Riga 6: paese
Usa json.MarshalIndent con due spazi per l'indentazione. Stampa la stringa JSON risultante.
Ad esempio, se ti viene fornito un contatto con il nome Alice Smith, senza telefono, con l'email alice@example.com, l'indirizzo 123 Main St, la città Boston e il paese USA, l'output dovrebbe essere simile a:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Nota che il campo phone non compare affatto perché era vuoto: è il tag omitempty in azione!
Provalo tu
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Leggi il nome
scanner.Scan()
name := scanner.Text()
// Leggi il numero di telefono (può essere vuoto)
scanner.Scan()
phone := scanner.Text()
// Leggi l'indirizzo email (può essere vuoto)
scanner.Scan()
email := scanner.Text()
// Leggi street
scanner.Scan()
street := scanner.Text()
// Leggi city
scanner.Scan()
city := scanner.Text()
// Leggi country
scanner.Scan()
country := scanner.Text()
// TODO: Crea un'istanza di Contact usando i valori di input
// Usa i tuoi tipi personalizzati Phone ed Email per i rispettivi campi
// Crea la struct Address annidata con street, city e country
// TODO: Usa json.MarshalIndent per convertire il contatto in JSON
// Usa "" come prefisso e " " (due spazi) come rientro
// TODO: Stampa la stringa JSON
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
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