Riepilogo - Collezione generica
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 72 di 107.
Sfida
FacileCostruiamo una struttura dati Queue generica che dimostri tutto ciò che hai imparato sui generics in Go! A differenza di uno stack (LIFO), una coda segue l’ordine First-In-First-Out (FIFO): il primo elemento aggiunto è il primo a essere rimosso.
Organizzerai il codice in due file:
queue.go: definisci la tua collezione generica di code.Crea una struct generica
Queue[T any]che memorizzi gli elementi al suo interno. La tua coda deve supportare queste operazioni:Enqueue(item T)- aggiunge un elemento alla fine della codaDequeue() (T, bool)- rimuove e restituisce l’elemento all’inizio della coda, insieme a un booleano che indica se l’operazione è riuscita (restituisci il valore zero efalsese la coda è vuota)Peek() (T, bool)- restituisce l’elemento all’inizio senza rimuoverlo (stesso schema di restituzione di Dequeue)Size() int- restituisce il numero di elementi nella codaIsEmpty() bool- restituisce true se la coda non contiene elementi
Crea anche una funzione costruttrice
NewQueue[T any]() *Queue[T]che restituisca un puntatore a una coda vuota inizializzata.main.go: mostra la tua coda con tipi diversi in base all’input.Leggi un indicatore di tipo (
intostring), poi leggi una serie di comandi da eseguire sulla coda. Ogni comando si trova su una riga separata:enqueue [value]- aggiunge il valore alla codadequeue- rimuove e stampa l’elemento all’inizio (stampaemptyse la coda è vuota)peek- stampa l’elemento all’inizio senza rimuoverlo (stampaemptyse la coda è vuota)size- stampa la dimensione attuale
Leggi i comandi finché non ricevi
done.
Verranno forniti i seguenti input:
- Riga 1: indicatore di tipo (
intostring) - Righe successive: comandi fino a
done
Per esempio, dato:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneIl tuo output dovrebbe essere:
10
10
2
20
30
emptyE dato:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneIl tuo output dovrebbe essere:
2
hello
hello
worldLa tua coda dovrebbe funzionare allo stesso modo sia con i tipi interi sia con quelli stringa, dimostrando come una singola implementazione generica possa gestire più tipi concreti mantenendo la piena sicurezza dei tipi.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Leggi l'indicatore del tipo
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Crea una coda di interi usando NewQueue[int]()
// Elabora i comandi per la coda di interi
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Gestisci i comandi: enqueue, dequeue, peek, size
// Per enqueue, ricava il valore intero da parts[1]
// Per dequeue/peek, stampa "empty" se la coda è vuota
_ = command
}
} else if typeIndicator == "string" {
// TODO: Crea una coda di stringhe usando NewQueue[string]()
// Elabora i comandi per la coda di stringhe
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Gestisci i comandi: enqueue, dequeue, peek, size
// Per enqueue, usa il valore stringa di parts[1]
// Per dequeue/peek, stampa "empty" se la coda è vuota
_ = command
}
}
// Queste istruzioni servono a evitare errori dovuti a import inutilizzati durante lo sviluppo
_ = strconv.Atoi
_ = fmt.Println
}
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