Struct per libri e utenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 99 di 107.
Sfida
FacileCostruiamo i modelli di dati fondamentali per il nostro sistema di gestione della biblioteca! Creerai le struct di base che rappresentano i libri e i membri della biblioteca, complete di funzioni costruttrici che li inizializzano con valori predefiniti sensati.
Organizzerai il codice in tre file:
book.go: Definisci la structBookcon i campiID,Title,Author,ISBNeAvailable(booleano). Crea una funzione costruttriceNewBookche accetta ID, titolo, autore e ISBN come parametri e restituisce un puntatore a un nuovo Book. I nuovi libri devono essere sempre inizialmente disponibili. Aggiungi un metodoInfo()che restituisce i dettagli del libro nel formato:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Definisci la structUsercon i campiID,Name,EmaileBorrowedBooks(una slice di stringhe in cui memorizzare gli ID dei libri). Crea una funzione costruttriceNewUserche accetta ID, nome ed email e restituisce un puntatore a un nuovo User con una lista vuota di libri presi in prestito. Aggiungi un metodoInfo()che restituisce:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Metti insieme i modelli creando libri e utenti a partire dall'input, quindi visualizzandone le informazioni.Leggi il numero di libri, poi per ciascun libro leggi il suo ID, titolo, autore e ISBN su righe separate. Poi leggi il numero di utenti e, per ciascun utente, leggi ID, nome ed email su righe separate.
Stampa le informazioni di ogni libro su una riga, seguite dalle informazioni di ogni utente, ciascuna sulla propria riga.
Verranno forniti i seguenti input:
- Numero di libri
- Per ogni libro: ID, titolo, autore, ISBN (ciascuno su una riga separata)
- Numero di utenti
- Per ogni utente: ID, nome, email (ciascuno su una riga separata)
Per esempio, dato:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comIl tuo output dovrebbe essere:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0E dato:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comIl tuo output dovrebbe essere:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0Nota come i costruttori gestiscono i valori predefiniti: i libri iniziano come disponibili e gli utenti iniziano con zero libri presi in prestito. Questo modello, che usa funzioni costruttrici per garantire una corretta inizializzazione, è fondamentale per creare sistemi affidabili!
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Leggi il numero di libri
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Crea una slice per memorizzare i libri
// Leggi i dettagli di ogni libro
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: Crea un nuovo libro usando il costruttore NewBook e aggiungilo alla slice
}
// Leggi il numero di utenti
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Crea una slice per memorizzare gli utenti
// Leggi i dettagli di ogni utente
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Crea un nuovo utente usando il costruttore NewUser e aggiungilo alla slice
}
// TODO: Stampa le informazioni di ogni libro usando il metodo Info()
// TODO: Stampa le informazioni di ogni utente usando il metodo Info()
fmt.Println() // Segnaposto - rimuovi durante l'implementazione
}
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 pool12Concetti avanzati di OOP
Pattern delle opzioni funzionaliPattern Builder in GoConcatenamento dei metodiAlias di tipo e definizioni a confrontoNozioni di base sulla reflectionPanoramica sulla generazione del codice15Progetto: Gestione della biblioteca
Panoramica e struttura del progettoStruct per libri e utentiEsercitati da solo: Compilatore Go online