Documentazione Go
Guida di riferimento a Go concisa e ricca di esempi. Leggi il concetto, guarda il codice e poi mettilo in pratica in un percorso Coddy.
Inizia un percorso guidato di GoPrimi passi
- Cos'è Go?Go (spesso chiamato Golang) è un linguaggio compilato e a tipizzazione statica, progettato da Google per costruire server e strumenti veloci e affidabili. Questa pagina spiega cos'è, a cosa serve e dove mostra i suoi limiti.
- Installare GoCome scaricare e installare Go su Windows, macOS e Linux, verificare l'installazione con go version, capire GOPATH e risolvere l'errore "go: command not found".
- Hello WorldIl programma hello world di Go riga per riga: package main, il blocco import, func main e fmt.Println, più come eseguirlo e i primi errori di compilazione che incontra chi comincia.
- go run e go buildCosa fanno go run, go build e go install, come Go assegna il nome al binario, come fare cross-compilazione con GOOS e GOARCH e i controlli go fmt e go vet da eseguire prima di un commit.
- Moduli GoCome funzionano i moduli Go: crearne uno con go mod init, scegliere un percorso di modulo, aggiungere dipendenze con go get, fare pulizia con go mod tidy, a cosa serve go.sum e replace per lo sviluppo in locale.
- Package e importCome funzionano i package di Go: la clausola package, l'import di package standard e di moduli, nomi esportati e non esportati, un package diviso su più file, i package internal, gli alias di import, gli import vuoti e l'errore "undefined" di go run main.go.
Le basi
- VariabiliCome dichiarare le variabili in Go con var e con la forma breve :=, cosa sono i valori zero, l'assegnazione multipla, lo shadowing e l'errore delle variabili inutilizzate che sorprendono chi inizia con Go.
- CostantiCome funziona const in Go: dichiarare costanti, la differenza tra costanti tipizzate e non tipizzate, le espressioni costanti con precisione arbitraria e perché Go non ha slice, mappe o struct costanti.
- Enum e iotaGo non ha una parola chiave enum. Questa pagina mostra il sostituto idiomatico: un tipo con nome più un blocco const con iota, e come aggiungere String(), validazione, parsing, flag di bit e supporto JSON.
- Tipi di datiI tipi integrati di Go: dimensioni e intervalli degli interi, float32 e float64, bool, string, byte e rune, numeri complessi, valori zero e come stampare il tipo di un valore con %T.
- Conversione di tipoCome convertire tra tipi in Go: da int a stringa e da stringa a int con strconv, da float a int, conversioni numeriche con T(v), byte e rune, la trappola di string(65) e la gestione degli errori di conversione.
- StringheLavorare con le stringhe in Go: il pacchetto strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), costruire stringhe in modo efficiente con strings.Builder, stringhe raw su più righe, immutabilità e perché len conta i byte.
- Rune e byteCosa significano rune e byte in Go, come le stringhe memorizzano UTF-8, perché len conta i byte, come range decodifica le rune, le conversioni tra string, []byte e []rune e l'uso del pacchetto bytes.
- fmt.Printf e SprintfCome il package fmt di Go stampa e formatta i valori: Println, Printf, Sprintf ed Errorf a confronto, la tabella completa dei verbi di formato (%v, %+v, %d, %s, %q, %f, %T, %w e altri), larghezza, precisione e riempimento.
Controllo del flusso
- if / elseCome funzionano if, else if ed else in Go: niente parentesi, graffe obbligatorie, l'if con una clausola di inizializzazione e il suo scope, l'idioma if err != nil e i return anticipati al posto dell'annidamento profondo.
- Ciclo forGo ha una sola parola chiave per i cicli, for, e copre tutto: il ciclo contatore a tre clausole, il ciclo while con sola condizione, il ciclo infinito e range su slice, mappe, stringhe, channel, interi e funzioni. In più break e continue con etichetta e la modifica delle variabili di ciclo in Go 1.22.
- Ciclo whileGo non ha la parola chiave while. Un ciclo for con la sola condizione è il while di Go, un for senza condizione è un ciclo infinito e un do-while è un ciclo infinito con il controllo alla fine.
- Cicli rangeCosa produce for range con slice, array, stringhe, map, channel, interi e funzioni iteratore, perché la variabile del valore è una copia, cosa succede se modifichi una slice o una map durante il range, e il range su funzioni di Go 1.23.
- Istruzione switchCome funziona switch in Go: i casi non proseguono nel successivo per default, un caso può elencare più valori, switch senza condizione sostituisce le catene if/else, switch con istruzione di inizializzazione, la parola chiave fallthrough e un breve sguardo ai type switch.
- Operatore ternarioGo non ha un operatore ternario (cond ? a : b). Questa pagina spiega perché, mostra il sostituto idiomatico con if/else, cmp.Or per i valori di default e una funzione generica di supporto, insieme alla trappola che la rende diversa da un vero ternario.
Funzioni
- FunzioniCome dichiarare e chiamare funzioni in Go: parametri, parametri che condividono il tipo, valori di ritorno, passaggio per valore e funzioni come valori da memorizzare e passare in giro.
- Valori di ritorno multipliLe funzioni Go possono restituire più valori. Questa pagina tratta la sintassi, la convenzione (valore, error), l'idioma comma-ok, i risultati con nome, i return nudi e l'identificatore vuoto.
- Funzioni variadicheUna funzione variadica in Go accetta un numero qualsiasi di argomenti finali di un unico tipo. Scopri la sintassi ...T, come passare uno slice con s..., la trappola dello slice condiviso e come fmt.Println usa ...any.
- ClosureLe funzioni anonime in Go possono catturare variabili dallo scope che le circonda. Così nascono le closure: contatori, generatori, middleware e callback che conservano un proprio stato.
- Istruzione deferdefer pianifica una chiamata da eseguire quando la funzione che la contiene ritorna. Scopri l'ordine LIFO, quando vengono valutati gli argomenti, come chiudere file e sbloccare mutex, defer nei cicli e come modificare i risultati con nome.
- MetodiUn metodo è una funzione con un receiver. Impara a dichiarare i metodi, quando usare un receiver valore o un receiver puntatore, i method set e le interface, e i metodi su tipi che non sono struct.
Collezioni
- ArrayUn array Go ha una lunghezza fissa che fa parte del suo tipo e viene copiato quando lo assegni. Scopri come dichiarare, scorrere, confrontare e passare gli array, e perché la maggior parte del codice Go usa invece gli slice.
- SliceGli slice sono il tipo lista di tutti i giorni in Go. Scopri make, append e la crescita, len e cap, come lo slicing condivide l'array sottostante (e il bug che ne deriva), copy, il pacchetto slices, gli slice 2D e la differenza tra nil e vuoto.
- MapLe map di Go memorizzano coppie chiave-valore con ricerca veloce. Impara a crearle, a controllare se una chiave esiste con comma-ok, a eliminare, iterare (in ordine casuale), ordinare le chiavi, memorizzare struct ed evitare i panic della map nil e delle scritture concorrenti.
- SetGo non ha un tipo set integrato. L'idioma standard è una mappa con valori struct vuoti. Scopri come aggiungere, verificare e rimuovere elementi, unione, intersezione e differenza, e come scrivere un piccolo Set generico.
- OrdinamentoOrdina gli slice in Go con slices.Sort e slices.SortFunc, ordina struct per uno o più campi con cmp.Compare, mantieni l'ordine degli elementi uguali con un ordinamento stabile e leggi il vecchio codice con sort.Slice.
Struct, interfacce e generics
- StructLe struct raggruppano campi con nome in un unico tipo. Scopri come definirle e inizializzarle, i valori zero, i puntatori a struct, le struct anonime, il confronto, i tag delle struct e la convenzione del costruttore NewX.
- PuntatoriUn puntatore contiene l'indirizzo di un valore. Impara & e *, new, i puntatori a struct, perché puoi restituire in sicurezza un puntatore a una variabile locale, quando usare i puntatori e il panic da dereferenziazione di un puntatore nil.
- InterfaceLe interface di Go si soddisfano in modo implicito: qualsiasi tipo con i metodi giusti le implementa. Impara le interface piccole come io.Reader e fmt.Stringer, l'interface vuota any, la trappola dell'interface nil e la regola accetta interface, restituisci struct.
- Struct embeddingL'embedding mette un tipo dentro un altro senza un nome di campo, così i suoi campi e metodi vengono promossi al tipo esterno. Scopri come funziona la promozione, l'embedding di interfacce, i conflitti di nomi e perché l'embedding non è ereditarietà.
- Type assertionUna type assertion estrae il valore concreto da un'interfaccia. Scopri x.(T), la forma comma-ok che non va mai in panic, l'asserzione verso un'altra interfaccia, i type switch ed errors.As per gli errori incapsulati.
- GenericsI generics (Go 1.18+) permettono a una sola funzione o a un solo tipo di lavorare con molti tipi restando type-safe. Scopri i parametri di tipo, i vincoli any, comparable e cmp.Ordered, i vincoli personalizzati con ~, i tipi generici e quando non usarli.
Errori
- Gestione degli erroriGo gestisce gli errori come valori normali restituiti dalle funzioni. Scopri l'interfaccia error, if err != nil, errors.New e fmt.Errorf, come restituire errori con contesto, come controllarli con errors.Is ed errors.As e come gestire ogni errore una sola volta.
- Errori personalizzatiDefinisci errori sentinella e tipi di errore personalizzati, avvolgi gli errori con %w, controllali con errors.Is ed errors.As, combinane diversi con errors.Join e scrivi i metodi Unwrap e Is quando ti servono.
- panic e recoverUn panic ferma l'esecuzione normale e risale lo stack, eseguendo le chiamate in defer. Scopri cosa causa i panic, come recover in una funzione in defer ne ferma uno, i messaggi di errore di runtime che vedrai e quando andare in panic è la scelta giusta.
Concorrenza
- GoroutineCome eseguire funzioni in modo concorrente con la parola chiave go, aspettare che finiscano, ottenere i risultati ed evitare data race, leak e crash che le goroutine rendono facili.
- ChannelCome i channel di Go passano valori tra goroutine: channel non bufferizzati e bufferizzati, chiusura e range, tipi direzionali, l'errore di deadlock e una pipeline costruita con i channel.
- Istruzione selectCome select attende più operazioni sui canali contemporaneamente: la scelta tra i casi pronti, invii e ricezioni non bloccanti con default, timeout con time.After e l'arresto dei cicli con un canale di uscita o un context.
- WaitGroupCome sync.WaitGroup aspetta che un gruppo di goroutine finisca: le regole di Add, Done e Wait, perché va passato per puntatore, come raccogliere risultati ed errori e un worker pool costruito su di esso.
- MutexCome proteggere lo stato condiviso tra goroutine con sync.Mutex e sync.RWMutex, quando basta sync/atomic, come sync.Once esegue un'inizializzazione una sola volta, e gli errori di lock che causano deadlock.
- Package contextCome context.Context porta cancellazione, scadenze e valori legati alla richiesta attraverso un programma Go: Background, WithCancel, WithTimeout, WithValue, ctx.Done in select e il context nei server e client HTTP.
Libreria standard
- Pacchetto timeCome lavorare con date e orari in Go: time.Now e time.Sleep, i calcoli con Duration, il layout di riferimento 2006-01-02 15:04:05 per Format e Parse, i fusi orari, i timestamp Unix, timer e ticker.
- JSONCome codificare e decodificare JSON in Go con encoding/json: Marshal e Unmarshal, struct tag come omitempty e omitzero, output indentato, decodifica in map[string]any, rifiuto dei campi sconosciuti e streaming con Decoder.
- Leggere e scrivere fileCome leggere e scrivere file in Go: os.ReadFile e os.WriteFile, leggere riga per riga con bufio.Scanner, aggiungere in coda con os.OpenFile, controllare se un file esiste e lavorare con le directory.
- Server HTTPCome costruire un web server con il package standard net/http di Go: handler, routing con ServeMux per metodo e wildcard nel percorso (Go 1.22), risposte JSON, status code, middleware, timeout e shutdown graduale.
- Client HTTPCome fare richieste HTTP in Go con net/http: http.Get, leggere e chiudere il body, controllare gli status code, i timeout di http.Client, richieste con context e header, parametri di query e POST di JSON.
- Argomenti da riga di comandoCome un programma Go legge la sua riga di comando: os.Args, il package flag per le opzioni tipizzate, i sottocomandi con FlagSet, le variabili d'ambiente con os.Getenv e os.LookupEnv e i codici di uscita con os.Exit.
- Espressioni regolariCome usare le espressioni regolari in Go con il pacchetto regexp: MustCompile, MatchString, FindString e FindAllString, gruppi di cattura e gruppi con nome, ReplaceAllString e i limiti della sintassi RE2, come l'assenza del lookbehind.
- LoggingCome fare logging in Go: il classico package log con i suoi flag e log.Fatal, e log/slog (Go 1.21) per log strutturati con livelli, attributi chiave-valore, handler testuali e JSON e logger che portano con sé il contesto tramite With.
Test e struttura del progetto
- TestCome testare il codice Go con il pacchetto standard testing e go test: file _test.go, funzioni TestXxx, t.Errorf e t.Fatalf, test a tabella con t.Run, helper e cartelle temporanee, copertura, benchmark con b.Loop e test di esempio.
- Struttura del progettoCome organizzare un progetto Go: parti piatto, dividi in package quando c'è un motivo, usa cmd/ per più binari e internal/ per il codice che nessun altro deve importare, dai buoni nomi ai package e tieni i test accanto al codice.