Struttura del corso
1. Introduzione a Go
- Che cos'è Go (Golang)?
- Storia e filosofia di progettazione di Go
- Go come linguaggio di programmazione per il web e i sistemi
- Caratteristiche principali:
- Tipi statici
- Semplicità e leggibilità
- Compilazione rapida
- Concorrenza integrata
- Raccolta del rifiuto (garbage collection)
- Compilazione multipiattaforma
- Casi d'uso comuni di Go
- Vantaggi e limiti di Go
- Confronto tra Go e C/C++, JavaScript, Ruby, Python e Java
- Comprendere l'ecosistema Go
- Panoramica della libreria standard Go
- Moduli Go e gestione delle dipendenze
- Anatomia di un'applicazione Go
- Pratica pratica (Hands-on): Esaminare ed eseguire un semplice programma Go
2. Configurazione dell'ambiente di sviluppo Go
- Installazione di Go
- Comprensione della toolchain Go
- Configurazione delle variabili di ambiente
- Scelta di un IDE o editor di codice
- Utilizzo della riga di comando con Go
- Creazione di uno spazio di lavoro Go
- Comprensione della struttura del progetto Go
- Inizializzazione di un progetto con Go Modules
- Utilizzo di
go mod init - Gestione delle dipendenze con
go get - Aggiornamento e ispezione delle dipendenze
- Formattazione del codice sorgente con
gofmt - Esecuzione dei programmi con
go run - Compilazione delle applicazioni con
go build - Installazione delle applicazioni Go
- Compilazione incrociata delle applicazioni
- Pratica pratica (Hands-on): Creare e configurare un progetto Go all'interno di un container
3. Variabili, costanti e tipi in Go
- Dichiarazione delle variabili
- Tipi espliciti rispetto a tipi inferiti
- Dichiarazioni brevi di variabili
- Costanti
- Valori zero
- Portata e durata delle variabili
- Tipi di dati primitivi:
- Interi
- Numeri in virgola mobile
- Numeri complessi
- Booleani
- Stringhe
- Conversioni di tipi
- Lavoro con Unicode e UTF-8
- Runes e byte
- Assegnazione multipla di variabili
- Comprensione della sicurezza dei tipi
- Esercizio: Costruire un piccolo programma di elaborazione dati da riga di comando
4. Operatori ed espressioni
- Operatori aritmetici
- Operatori di confronto
- Operatori logici
- Operatori di assegnazione
- Incremento e decremento
- Priorità degli operatori
- Calcoli con interi e numeri in virgola mobile
- Evitare comuni errori di conversione dei tipi
- Esercizio: Implementare calcoli e logica di validazione
5. Date, orari e formattazione
- Utilizzo del pacchetto
time - Creazione e manipolazione delle date
- Recupero dell'ora corrente
- Fusi orari e posizioni
- Parsing di date e orari
- Formattazione di date e orari
- Calcolo delle durate
- Lavoro con timestamp Unix
- Gestione dei timeout
- Esercizio: Aggiungere timestamp e calcoli delle durate a un'applicazione
6. Array, slice, mappe e strutture (structs)
Array
- Dichiarazione degli array
- Inizializzazione degli array
- Percorso degli array
- Array multidimensionali
Slice
- Comprensione delle slice rispetto agli array
- Creazione delle slice
- Aggiunta di elementi
- Copia delle slice
- Lunghezza e capacità delle slice
- Creazione di slice da altre slice
- Più comuni errori con le slice
Mappe
- Creazione delle mappe
- Aggiunta e rimozione di voci
- Verifica dell'esistenza di una chiave
- Percorso delle mappe
- Mappe contenenti dati complessi
Strutture (Structs)
-
Definizione delle strutture
-
Campi delle strutture
-
Inizializzazione delle strutture
-
Strutture nidificate
-
Strutture anonime
-
Metodi delle strutture
-
Tag JSON delle strutture
-
Pratica pratica (Hands-on): Modellare utenti, prodotti e dati dell'applicazione utilizzando strutture, slice e mappe
7. Logica condizionale e cicli
- Istruzioni
if -
elseeelse if - Dichiarazioni di variabili all'interno di condizioni
- Cicli
for - Cicli infiniti
- Condizioni di ciclo
-
breakecontinue - Percorso con
range - Cicli nidificati
- Istruzioni
switch - Switch basati su espressioni
- Multipli casi
- Casi predefiniti
- Type switch
- Esercizio: Implementare logica di validazione ed elaborazione dell'applicazione
8. Funzioni
- Definizione delle funzioni
- Parametri delle funzioni
- Valori di ritorno
- Multipli valori di ritorno
- Valori di ritorno denominati
- Funzioni variadiche
- Funzioni anonime
- Valori di funzione
- Closure
- Ricorsione
- Passaggio di funzioni come argomenti
- Funzioni che restituiscono errori
- Progettazione di funzioni piccole e riutilizzabili
- Esercizio: Rifattorizzare il codice esistente in funzioni riutilizzabili
9. Pointer e concetti di memoria
- Che cos'è un pointer?
- Operatori di indirizzo e dereferencing
- Pointer e parametri delle funzioni
- Riceventi pointer
- Pointer a strutture
- Pointer nil
- Quando usare i pointer
- Semantica di valore rispetto alla semantica di riferimento
- Comprensione della gestione della memoria e della garbage collection in Go
- Errori comuni con i pointer
- Pratica pratica (Hands-on): Modificare i dati dell'applicazione utilizzando i pointer
10. Creazione di un'applicazione web in Go
- Panoramica delle capacità web di Go
- Introduzione al pacchetto
net/http - Creazione di un server HTTP
- Richieste e risposte HTTP
- Metodi HTTP
- URL delle richieste e parametri di query
- Header HTTP
- Codici di stato HTTP
- Fondamenti del routing
- Creazione di handler
- Gestione dei dati dei moduli
- Servizio di file statici
- Lavoro con template HTML
- Variabili dei template e strutture di controllo
- Strutturazione di un'applicazione web
- Pratica pratica (Hands-on): Costruire un server web di base in Go
11. Costruzione di un servizio web RESTful
- Fondamenti dell'architettura REST
- Progettazione di endpoint API
- GET, POST, PUT, PATCH e DELETE
- Lavoro con JSON
- Encoding e decoding di JSON
- Validazione delle richieste
- Codici di stato HTTP
- Risposte di errore
- Parametri di query e parametri di percorso
- Strutture delle risposte API
- Separazione degli handler dalla logica di business
- Pratica pratica (Hands-on): Costruire un'API REST CRUD
12. Runtime Go, compilazione e build del progetto
- Comprensione del compilatore Go
- Processo di build di Go
go rungo buildgo installgo test- Flag di build
- Configurazione specifica per ambiente
- Build per diversi sistemi operativi e architetture
- Produzione di binari standalone
- Gestione della configurazione dell'applicazione
- Esercizio: Compilare l'applicazione per più piattaforme
13. Lavorazione con file e web
- Apertura e chiusura dei file
- Lettura dei file
- Scrittura dei file
- Creazione di directory
- Metadati dei file
- I/O con buffer
- Lavoro con stream
- Lettura e scrittura di file JSON
- Client HTTP
- Effettuazione di richieste HTTP in uscita
- Gestione degli errori del client HTTP
- Timeout e cancellazione
- Elaborazione delle risposte API
- Pratica pratica (Hands-on): Recuperare dati da un'API esterna e salvarli localmente
14. Gestione degli errori e debug
- L'approccio di Go agli errori
- Restituzione di errori dalle funzioni
- Verifica degli errori
- Creazione di errori personalizzati
- Wrapping degli errori
- Aggiunta di contesto agli errori
-
errors.Iseerrors.As - Panic e recovery
- Quando usare
panic - Debug di problemi comuni in Go
- Logging dell'attività dell'applicazione
- Utilizzo degli strumenti di debug di Go
- Esercizio: Diagnosire e correggere errori applicativi introdotti deliberatamente
15. Interfacce e astrazione
- Che cos'è un'interfaccia?
- Implementazione implicita delle interfacce
- Definizione delle interfacce
- Valori delle interfacce
- Interfacce vuote /
any - Affermazioni di tipo
- Type switch
- Implementazioni tramite pointer rispetto a quelle tramite valore
- Progettazione di interfacce piccole
- Inversione delle dipendenze
- Uso delle interfacce per il testing
- Riduzione del coupling dell'applicazione
- Pratica pratica (Hands-on): Introdurre interfacce nell'applicazione web di esempio
16. Pacchetti e organizzazione del progetto
- Creazione dei pacchetti
- Convenzioni di denominazione dei pacchetti
- Identificatori esportati e non esportati
- Importazione dei pacchetti
- Inizializzazione dei pacchetti
- Organizzazione dei livelli dell'applicazione
- Pacchetti interni
- Gestione delle dipendenze con Go Modules
- Versionamento semantico
- Uso di pacchetti di terze parti
- Evitamento di dipendenze circolari
- Progettazione di progetti Go manutenibili
- Esercizio: Rifattorizzare l'applicazione in pacchetti separati
17. Concorrenza con Goroutine
- Che cos'è la concorrenza?
- Goroutine
- Avvio delle goroutine
- Comprensione dell'esecuzione concorrente leggera
- Sfide di sincronizzazione
- Stato condiviso
- Condizioni di race
- Utilizzo di
sync.WaitGroup - Mutex e mutex di lettura/scrittura
- Operazioni atomiche
- Pratica pratica (Hands-on): Convertire un compito sequenziale in un'elaborazione concorrente
18. Canali (Channels)
- Comprensione dei canali
- Invio e ricezione di valori
- Canali con buffer rispetto a canali senza buffer
- Comportamento bloccante
- Chiusura dei canali
- Percorso dei canali
- Canali direzionali
- Comunicazione basata su canali
- Istruzioni Select
- Timeout e cancellazione
- Pattern worker-pool
- Pattern produttore/consumatore
- Pratica pratica (Hands-on): Costruire un sistema di worker concorrente
19. Context e gestione delle richieste
- Perché i context sono importanti nelle applicazioni web
context.Context- Context con portata della richiesta
- Cancellazione
- Scadenze (Deadlines)
- Timeout
- Propagazione del context attraverso i livelli dell'applicazione
- Cancellazione di operazioni di database o HTTP
- Evitamento dell'uso improprio dei context
- Esercizio: Aggiungere cancellazione delle richieste e timeout all'applicazione web
20. Testing delle applicazioni Go
- Perché il testing automatico è importante
- Scrittura di unit test
- Pacchetto
testing - Funzioni di test
- Convenzioni di denominazione dei test
- Test guidati da tabelle
- Testing degli errori
- Testing degli handler HTTP
- Server di test HTTP
- Fixture di test
- Copertura dei test
- Benchmark
- Test di esempio
- Testing delle interfacce con mock o finte implementazioni
- Pratica pratica (Hands-on): Creare una suite di test per l'applicazione di esempio
21. Ottimizzazione delle prestazioni
- Comprensione delle prestazioni delle applicazioni Go
- Identificazione dei colli di bottiglia
- Prestazioni di CPU rispetto a quelle di memoria
- Strutture dati efficienti
- Riduzione delle allocazioni non necessarie
- Stringhe, byte e buffer
- Gestione delle goroutine
- Evitamento della concorrenza eccessiva
- Strategie di caching
- Considerazioni su database e rete
- Profiling delle applicazioni
- Benchmark e test delle prestazioni
- Utilizzo degli strumenti di profiling di Go
- Esercizio: Profilare e ottimizzare un'applicazione deliberatamente inefficiente
22. Sicurezza e buone pratiche per applicazioni web robuste
- Validazione degli input dell'utente
- Gestione sicura delle richieste HTTP
- Prevenzione delle vulnerabilità web comuni
- Gestione sicura degli errori
- Concetti di autenticazione e autorizzazione
- Gestione dei segreti e della configurazione
- Comunicazione HTTP sicura
- Evitamento di informazioni sensibili nei log
- Gestione e aggiornamento delle dipendenze
- Limiti delle risorse e timeout delle richieste
- Esercizio: Rivedere e rafforzare l'API di esempio
23. Logging e osservabilità delle applicazioni
- Fondamenti del logging
- Logging strutturato
- Livelli di log
- Logging delle richieste
- Logging degli errori
- Correlazione e ID delle richieste
- Monitoraggio del comportamento dell'applicazione
- Metriche di base
- Endpoint di verifica dello stato (health-check)
- Diagnosi dei problemi in produzione
- Pratica pratica (Hands-on): Aggiungere logging strutturato e health-check
24. Containerizzazione dell'applicazione Go
- Perché usare i container?
- Applicazioni Go e containerizzazione
- Scrittura di un Dockerfile
- Build multistage
- Costruzione di un'immagine di runtime minimale
- Gestione della configurazione tramite variabili di ambiente
- Rete del container
- Eposizione delle porte dell'applicazione
- Esecuzione dell'applicazione in un container
- Testing dell'applicazione containerizzata
- Pratica pratica (Hands-on): Confezionare l'applicazione Go di esempio come un container pronto per la produzione
25. Deployment
- Preparazione dell'applicazione per la produzione
- Build dei binari di produzione
- Configurazione dell'ambiente
- Deployment basato su container
- Architettura del deployment
- Proxy inversi
- Considerazioni su HTTPS/TLS
- Verifiche dello stato dell'applicazione
- Shutdown elegante
- Gestione dei segnali del sistema operativo
- Scaling delle applicazioni web Go
- Scaling orizzontale rispetto a quello verticale
- Risoluzione dei problemi di base del deployment
- Pratica pratica (Hands-on): Distribuire l'applicazione web di esempio
26. Progetto finale: Applicazione web Go completa
I partecipanti uniscono i concetti sviluppando un'applicazione completa.
Il progetto può includere:
- Inizializzazione del progetto con Go Modules
- Organizzazione dei pacchetti
- Routing HTTP
- Endpoint API REST
- Gestione di richieste e risposte JSON
- Validazione degli input
- Gestione degli errori
- Interfacce
- Elaborazione concorrente
- Comunicazione con API esterne
- Persistenza in file o database
- Test automatizzati
- Logging
- Considerazioni sulle prestazioni
- Containerizzazione
- Configurazione di produzione
- Deployment
27. Revisione e buone pratiche
- Revisione della sintassi fondamentale di Go
- Convenzioni di codifica Go
- Scrittura di Go idiomatico
- Mantenere il codice semplice
- Progettazione efficace dei pacchetti
- Buone pratiche di gestione degli errori
- Principi di progettazione delle interfacce
- Buone pratiche di concorrenza
- Strategie di testing
- Considerazioni sulle prestazioni
- Manutenibilità e leggibilità
- Errori comuni commessi dai nuovi sviluppatori Go
- Approcci consigliati per continuare lo sviluppo Go
28. Conclusione
- Revisione dei concetti chiave
- Revisione dell'applicazione web completata
- Domande e discussione
- Risoluzione dei problemi in scenari reali comuni
- Prossimi passi consigliati per lo sviluppo Go
- Ulteriori librerie Go e risorse dell'ecosistema
- Ulteriori opportunità per costruire servizi Go di livello produttivo
Requisiti
- Conoscenza dei principi generali della programmazione
Pubblico
- Sviluppatori
Recensioni (5)
Il formatore ha dimostrato di essere un esperto del tema, il che non do per scontato. Ha fornito intuizioni molto utili sulle norme dell'industria.
Giuseppe
Corso - Learning Go Programming
Traduzione automatica
Ho apprezzato molto l'abbondanza di esercizi pratici che abbiamo svolto. Imparo meglio facendo, quindi è stato utile che Francesco avesse proposto molti esercizi pratici da svolgere. Ho faticato a comprendere alcuni concetti presentati nelle slide, ma quando ho potuto mettere le mani sul codice e implementare alcune delle funzionalità principali del linguaggio, mi è stato più facile capirli.
Adam Fitzhugh - OpticoreIT
Corso - Learning Go Programming
Traduzione automatica
la velocità, la capacità dei formatori di aiutare e sostenere domande leggermente più difficili.
Andrei Mihai - Viasat
Corso - Learning Go Programming
Traduzione automatica
La vasta conoscenza di Radu e l'adattamento del ritmo alle mie esigenze.
Adeel Ahmad - Coefficient Data Ltd
Corso - Learning Go Programming
Traduzione automatica
Flessibilità del formatore. Ha davvero adattato il corso alle nostre esigenze specifiche.
Daniel Kurner - Daimler TSS
Corso - Learning Go Programming
Traduzione automatica