Un linguaggio nato dalla frustrazione
Go nasce dalla frustrazione quotidiana di tre ingegneri di Google — Robert Griesemer, Rob Pike e Ken Thompson — davanti ai tempi di compilazione del codice C++ che alimenta l’infrastruttura dell’azienda. Compilazioni che richiedono minuti, dipendenze che si propagano a catena, un sistema di tipi complesso che rallenta lo sviluppo: i linguaggi esistenti non sono progettati per le dimensioni dei codebase e dei team di Google. La risposta è un linguaggio nuovo, volutamente minimale, che privilegia la semplicità e la velocità di compilazione rispetto alla ricchezza sintattica.
Con il rilascio della versione 1.0 nel marzo 2012, Go raggiunge la stabilità delle API: il codice scritto per Go 1.0 continuerà a compilare e funzionare con le versioni successive, una garanzia fondamentale per l’adozione in produzione.
Compilazione e binari statici
Go è un linguaggio compilato e staticamente tipizzato con un garbage collector integrato. La compilazione è estremamente rapida — ordini di grandezza più veloce di C++ — perché il sistema di dipendenze è progettato per evitare la ricompilazione transitiva. Il compilatore produce un binario statico singolo che include tutte le dipendenze: nessun runtime da installare, nessuna libreria condivisa da gestire. Il deployment si riduce alla copia di un file eseguibile.
La libreria standard è ricca e orientata ai servizi di rete: server HTTP, client HTTP, gestione di JSON, crittografia, I/O, manipolazione di stringhe. Scrivere un server web funzionale richiede poche righe di codice e nessuna dipendenza esterna.
Goroutine e channel
Il modello di concorrenza di Go si basa su due primitive: le goroutine e i channel. Una goroutine è una funzione eseguita concorrentemente, gestita dallo scheduler del runtime Go anziché dal sistema operativo. Il costo di creazione è minimo — pochi kilobyte di stack — e un singolo processo può gestire centinaia di migliaia di goroutine attive.
I channel sono il meccanismo di comunicazione tra goroutine: strutture dati tipizzate attraverso cui le goroutine si scambiano valori in modo sicuro. Il motto è “Don’t communicate by sharing memory; share memory by communicating”: anziché proteggere dati condivisi con lock, le goroutine si coordinano passandosi messaggi.
Semplicità come scelta progettuale
Go non ha classi, non ha ereditarietà, non ha eccezioni, non ha generics. Queste assenze sono scelte deliberate: ogni funzionalità aggiunta è una funzionalità che ogni sviluppatore deve comprendere. Il risultato è un linguaggio che si impara in settimane e produce codice leggibile da chiunque conosca i fondamenti. Per i servizi di rete ad alta concorrenza, Go offre un equilibrio raro tra prestazioni, semplicità e produttività.
Link: golang.org
