È ormai risaputo che con il nome “Google” non ci si riferisce più solo a un motore di ricerca. L’as­sor­ti­men­to di prodotti comprende servizi web utili come Google Maps, piat­ta­for­me di en­ter­tain­ment come YouTube e Google Music, ap­pli­ca­zio­ni di co­mu­ni­ca­zio­ne come Gmail, soluzioni Office come Google Docs e persino hardware come lo smart­pho­ne Pixel, ideato da Google. Inoltre la mul­ti­na­zio­na­le fornisce da anni utili tool per svi­lup­pa­to­ri web e software. A partire da marzo 2012 rientra nel portfolio dell’azienda anche il sempre più amato lin­guag­gio di pro­gram­ma­zio­ne Go, co­no­sciu­to anche con il nome di Golang.

Che cos’è Golang?

A settembre 2017 gli svi­lup­pa­to­ri Robert Griesemer, Rob Pike e Ken Thompson, impiegati di Google, hanno formulato i loro obiettivi per un lin­guag­gio di pro­gram­ma­zio­ne ot­ti­miz­za­to e sem­pli­fi­ca­to, gettando le basi per Go o Golang. Quello che è iniziato dapprima come un progetto più piccolo, si è tra­sfor­ma­to in fretta in un progetto ambizioso, il cui sviluppo Google ha portato vo­lu­ta­men­te avanti, mettendo a di­spo­si­zio­ne le risorse ne­ces­sa­rie.

Dopo che Go alla fine del 2011 è stato uf­fi­cial­men­te pre­sen­ta­to come progetto open source (licenza BSD), sono spuntati ve­lo­ce­men­te un gran numero di supporter nella community, che con­tri­bui­sco­no ancora oggi allo sviluppo e all’ot­ti­miz­za­zio­ne del lin­guag­gio di pro­gram­ma­zio­ne. La release finale della prima versione stabile (1.0) è avvenuta il 28 marzo 2012. A partire dalla versione 1.1, che è seguita un anno dopo, Google ha ri­la­scia­to ag­gior­na­men­ti circa ogni 6 mesi.

Fatto

La mascotte e il logo di Golang, una par­ti­co­la­re specie di roditore del Nord America chiamata Gopher, sono stati ideati da Renée French, la cui crea­ti­vi­tà ha dato vita anche a Glenda, il coniglio Plan 9. Anche a questo sistema operativo UNIX di Bell Labs, svi­lup­pa­to negli anni 80, hanno preso parte Rob Pike e Ken Thompson.

La sintassi di Golang è for­te­men­te orientata alla sintassi di base della famiglia C ma mostra anche notevoli influenze pro­ve­nien­ti dai linguaggi svi­lup­pa­ti da Niklaus Wirth come Pascal, Modula e Oberon. Inoltre in essa sono confluiti aspetti di linguaggi come Newsqueak e Limbo, a loro volta ispirati dal processo CSP (Com­mu­ni­ca­ting Sequential Processes) di Tony Hoares.

Golang è com­pi­la­bi­le, anche se si è con­cen­tra­to sin dall’inizio nel garantire un’elevata velocità di con­ver­sio­ne. Inoltre il lin­guag­gio di pro­gram­ma­zio­ne dispone di una modalità au­to­ma­ti­ca per la pulizia della memoria (in inglese Garbage Col­lec­tion o ab­bre­via­to in GC), che si occupa in back­ground di una gestione ottimale delle risorse della memoria di­spo­ni­bi­li e in questo modo impedisce l’insorgere di relativi problemi.

Come si può clas­si­fi­ca­re Golang tra i linguaggi di pro­gram­ma­zio­ne?

Sebbene Golang sia re­la­ti­va­men­te giovane rispetto agli altri linguaggi di pro­gram­ma­zio­ne, è stato già svi­lup­pa­to suf­fi­cien­te­men­te e risulta così stabile da essere uti­liz­za­to dagli svi­lup­pa­to­ri di tutto il mondo; persino lo stesso Google ricorre alle pos­si­bi­li­tà offerte da questo lin­guag­gio di pro­gram­ma­zio­ne.

Golang si con­trad­di­stin­gue spe­cial­men­te per la sua sem­pli­ci­tà e mul­ti­fun­zio­na­li­tà che gli svi­lup­pa­to­ri avevano previsto sin dall’inizio. Infatti il nuovo lin­guag­gio di pro­gram­ma­zio­ne nasce dall’in­sod­di­sfa­zio­ne provocata dai rap­pre­sen­tan­ti affermati in questo settore che emer­ge­va­no per una com­pi­la­zio­ne del codice ef­fi­cien­te o per una ese­cu­zio­ne veloce o ancora per un processo di pro­gram­ma­zio­ne semplice ma senza pre­sen­ta­re tutti e tre i vantaggi insieme.

Tramite la com­bi­na­zio­ne di im­por­tan­ti feature tratte da diverse famiglie lin­gui­sti­che, Golang dà in questo frangente il buon esempio: così la lingua di Google combina la facilità di pro­gram­ma­zio­ne, che con­trad­di­stin­gue il lin­guag­gio in­ter­pre­ta­to e dinamico, con l’ef­fi­cien­za e la sicurezza di un lin­guag­gio tipizzato e compilato in modo statico. In più la struttura di Go mira a con­sen­ti­re un breve processo di sviluppo che permette di creare anche file grandi ed ese­gui­bi­li su un singolo computer nel giro di pochi secondi. Alcune delle ca­rat­te­ri­sti­che di markup decisive di Golang, tramite le quali può essere raggiunto questo standard di qualità, sono:

  • un sistema di tipi con una forte proprietà di espres­sio­ne ma leggero per una clas­si­fi­ca­zio­ne e dif­fe­ren­zia­zio­ne ottimale dei diversi oggetti (variabili, funzioni, ecc.);
  • la con­cor­ren­za (pro­gram­ma­zio­ne parallela) per un’ese­cu­zio­ne più veloce del programma;
  • la già men­zio­na­ta pulizia au­to­ma­ti­ca (GC) per garantire un utilizzo ottimale della memoria di­spo­ni­bi­le e per evitare problemi correlati;
  • una spe­ci­fi­ca­zio­ne rigida di di­pen­den­ze senza una sintassi di­chia­ra­ti­va im­pe­gna­ti­va;
  • l’uso su tutte le piat­ta­for­me, con­sen­ten­do così di uti­liz­za­re le ap­pli­ca­zio­ni svi­lup­pa­te su tutti i sistemi comuni.

Pro­gram­ma­re con Golang: le par­ti­co­la­ri­tà

La sintassi di Go si basa sulla classica sintassi di C, ma si dif­fe­ren­zia dal lin­guag­gio di pro­gram­ma­zio­ne, già svi­lup­pa­to nel 1972, con una serie di piccoli mi­glio­ra­men­ti e una gamma di funzioni no­te­vol­men­te ridotta. Così, ad esempio, nella pro­gram­ma­zio­ne con Golang non è ob­bli­ga­to­rio inserire le parentesi tonde nelle con­di­zio­ni e nei cicli e op­zio­nal­men­te si può mettere il punto e virgola finale, tipico dei linguaggi della famiglia C.

In aggiunta si può regolare la validità degli iden­ti­fi­ca­to­ri (i nomi degli elementi suddetti) at­tra­ver­so il modo di scrittura (maiuscolo o minuscolo). Ad esempio se un iden­ti­fi­ca­to­re deve essere attivo anche al di fuori di un de­ter­mi­na­to pacchetto Go, è ne­ces­sa­rio scrivere le prime lettere maiuscole. Di seguito vi elen­chia­mo altre par­ti­co­la­ri­tà della pro­gram­ma­zio­ne con Golang:

  • Ambiente GOPATH come base: uno dei primi atti d’ufficio nella pro­gram­ma­zio­ne con Go consiste nel creare la directory GOPATH, com­pren­si­va delle sot­to­di­rec­to­ry “src” (file sorgente Go), “pkg” (oggetti del pacchetto Go “package objects”) e “bin” (comandi ese­gui­bi­li). Tutto il codice Go com­pren­si­vo di di­pen­den­ze si può gestire tramite questo ambiente di lavoro. La posizione di me­mo­riz­za­zio­ne di questa directory ob­bli­ga­to­ria GOPATH si può scegliere li­be­ra­men­te.
  • Struttura modulare con i pacchetti GOLANG (packages): i file sorgente su Golang si possono or­ga­niz­za­re in modo modulare tramite directory che vengono indicate come packages o pacchetti. Il nome della relativa directory è così allo stesso tempo anche il nome del pacchetto, di cui fanno parte tutti i file sorgente che si trovano in questa cartella. Se le funzioni, i tipi, ecc. dovessero essere applicati tra i diversi pacchetti, va uti­liz­za­ta la già citata scrittura maiuscola del cor­ri­spon­den­te iden­ti­fi­ca­to­re.
  • For­mat­ta­zio­ne del codice unitaria e con­si­glia­ta: Golang sta­bi­li­sce de­ter­mi­na­te con­ven­zio­ni per la for­mat­ta­zio­ne del codice, ad esempio per l’in­ter­val­lo esatto tra i singoli elementi. Quindi chi ha imparato a pro­gram­ma­re ap­pli­ca­zio­ni con Golang può anche leggere fa­cil­men­te il codice di altri svi­lup­pa­to­ri senza dover decifrare pre­ven­ti­va­men­te il suo stile di for­mat­ta­zio­ne personale, com’è il caso di molti altri linguaggi. Il formato non deve essere ri­spet­ta­to fin nel più piccolo dettaglio dal redattore: il tool integrato gofmt ottimizza au­to­ma­ti­ca­men­te il codice Golang, ri­sol­ven­do for­mat­ta­zio­ni errate.
  • Import relativi come standard: tutti i file e i pacchetti che vengono importati nei progetti di Golang (au­to­no­ma­men­te o da parte di terzi) sono sempre relativi alla cartella GOPATH/src rendendo così il processo di im­por­ta­zio­ne molto facile. Inoltre Go non compila gli elementi importati se non vengono ef­fet­ti­va­men­te uti­liz­za­ti. In questo modo un codice pulito è garantito solo quando i com­po­nen­ti importati non vengono o non sono più uti­liz­za­ti.
  • Valori di ritorno multipli per funzioni e metodi: con Go si possono generare funzioni e metodi che possono re­sti­tui­re più valori. In questo modo Go può ad esempio separare in maniera pulita un risultato valido e un errore inserito al­ter­na­ti­va­men­te al momento della re­sti­tu­zio­ne. Invece con C gli errori di scrittura vengono resi tramite un valore numerico negativo, mentre il codice di errore effettivo viene con­ser­va­to se­pa­ra­ta­men­te.

Punti di forza e campi di ap­pli­ca­zio­ne di Golang

Molti punti di forza ele­men­ta­ri di Golang sono già stati esposti in questo articolo: per via della sua sem­pli­ci­tà il lin­guag­gio di Google, rispetto agli altri linguaggi di pro­gram­ma­zio­ne, risulta no­te­vol­men­te meno pesante per gli svi­lup­pa­to­ri. Chi ha in­te­rio­riz­za­to i fon­da­men­ti ap­pro­fit­ta del semplice utilizzo e degli in­nu­me­re­vo­li au­to­ma­ti­smi, che com­por­ta­no un notevole risparmio di tempo.

A questo scopo Go fornisce appositi software come ad esempio gofmt, che agisce au­to­no­ma­men­te per l’ot­ti­miz­za­zio­ne au­to­ma­ti­ca del codice, dando anche la risposta perfetta a compiti che diventano sempre più complessi nello sviluppo software. A questo si aggiunge il fatto che il codice Golang è for­mat­ta­to sempre allo stesso modo, cosa che sem­pli­fi­ca no­te­vol­men­te la leg­gi­bi­li­tà generale e di con­se­guen­za la col­la­bo­ra­zio­ne nel team.

Un altro punto di forza che invoglia a pro­gram­ma­re con Golang è la buona per­for­man­ce di­mo­stra­ta da questo lin­guag­gio di pro­gram­ma­zio­ne. La velocità di ese­cu­zio­ne delle ap­pli­ca­zio­ni Go convince nel confronto generale con altri linguaggi di com­pi­la­zio­ne. Così la velocità di com­pi­la­zio­ne cor­ri­spon­de ad esempio ap­pros­si­ma­ti­va­men­te a quella di Java. Mentre molte ap­pli­ca­zio­ni Java si basano sul framework Spring e hanno perciò bisogno di un certo tempo nel processo di avvio, fino a quando possono essere risolte le richieste HTTP, i servizi di Golang uti­liz­za­no le im­ple­men­ta­zio­ni già presenti nella libreria standard, cosa che accelera no­te­vol­men­te il processo di avvio.

Di con­se­guen­za è meno sor­pren­den­te che Golang finora venga uti­liz­za­to so­prat­tut­to in ambienti aziendali e server, dove la stabilità e la per­for­man­ce dei servizi giocano un ruolo im­por­tan­te. In par­ti­co­la­re nella vir­tua­liz­za­zio­ne con i container è richiesto questo lin­guag­gio di pro­gram­ma­zio­ne giovane, cosa che in ultimo è da ri­con­dur­re al fatto che Docker, uno dei maggiori rap­pre­sen­tan­ti tra le piat­ta­for­me container, si basa su Go.

Cosa può ancora imparare dagli altri linguaggi di pro­gram­ma­zio­ne?

No­no­stan­te tutti gli elogi rivolti al moderno lin­guag­gio di pro­gram­ma­zio­ne di Google, non deve ov­via­men­te passare inos­ser­va­ti anche un paio di punti deboli. Questi sono prin­ci­pal­men­te da imputare alla sem­pli­ci­tà di Golang, che pur essendo da una parte il suo maggiore punto di forza, dall’altra ne determina la mancanza di de­ter­mi­na­te sfac­cet­ta­tu­re che alcuni svi­lup­pa­to­ri ap­prez­za­no negli altri linguaggi di pro­gram­ma­zio­ne.

Prima fra tutti è si­cu­ra­men­te da nominare la mancanza di tipi generici nella libreria standard, quindi non si ha la pos­si­bi­li­tà di inserire parametri per­so­na­liz­za­ti per i tipi di dati. Chi perciò è un so­ste­ni­to­re della pro­gram­ma­zio­ne con i tipi ed è ad esempio abituato all’uso di Generics su Java, per ora deve ri­nun­cia­re a una feature simile su Go; tuttavia il team di Go non esclude l’im­ple­men­ta­zio­ne di tipi generici in future versioni del lin­guag­gio.

Molti svi­lup­pa­to­ri avranno bisogno di un po’ di tempo per abituarsi alla rinuncia di classi, ere­di­ta­rie­tà e co­strut­to­ri. Un’altra feature di Go non sempre de­si­de­ra­ta è rap­pre­sen­ta­ta dalla scomparsa au­to­ma­ti­ca di file di im­por­ta­zio­ne non attivi. Altri linguaggi puntano in questo caso alla pos­si­bi­li­tà di “com­men­ta­re” i cor­ri­spon­den­ti com­po­nen­ti, di modo da mantenere invariato il codice di pro­gram­ma­zio­ne, malgrado l’inat­ti­vi­tà.

Un altro svan­tag­gio di Golang rispetto ai linguaggi più antichi come C, C++ e simili trova le sue radici nella storia ancora molto recente del lin­guag­gio. Così dispone di un arsenale es­sen­zial­men­te più piccolo di pacchetti im­ple­men­ta­ti in modo standard e pronti per l’im­por­ta­zio­ne. Inoltre per Go si trovano in rete anche meno manuali, tutorial, ecc. rispetto ai linguaggi di pro­gram­ma­zio­ne affermati.

Vantaggi e svantaggi di Golang a confronto

I punti di forza di Golang I punti deboli di Golang
Mul­ti­piat­ta­for­ma Assenza di tipi generici
Sintassi molto sem­pli­fi­ca­ta Orientata agli oggetti solo par­zial­men­te
Gestione au­to­ma­ti­ca del processo di me­mo­riz­za­zio­ne (Garbage Col­lec­tion) Supporto di IDE (Integrated Deve­lo­p­ment Envi­ron­men­ts) da po­ten­zia­re
For­mat­ta­zio­ne unitaria del codice Offerta pro­por­zio­nal­men­te ridotta di librerie e pacchetti offerti da terze parti
Processo di im­por­ta­zio­ne semplice Passaggio faticoso dai linguaggi di pro­gram­ma­zio­ne classici, orientati agli oggetti, come Java e C++
Più valori di ritorno per funzioni e metodi Per ora pochi tutorial, esperti, ecc.
Cor­re­zio­ne del codice au­to­ma­ti­ca (gofmt)  
Con­cor­ren­za  
Libreria standard ampia (spe­cial­men­te per HTTP e compiti di rete)  

Con­clu­sio­ne: a chi conviene imparare a uti­liz­za­re Golang?

Dopo aver messo in luce i fon­da­men­ti e le par­ti­co­la­ri­tà di questo lin­guag­gio di pro­gram­ma­zio­ne open source in questo articolo, alla fine rimane so­prat­tut­to una domanda: chi dovrebbe prendersi la briga di imparare a pro­gram­ma­re con Golang? Come spesso accade, anche in questo caso non si può dare una risposta unica e de­fi­ni­ti­va, poiché Go non si presenta come un sostituto di tutti i linguaggi di pro­gram­ma­zio­ne usati finora, ma come una possibile al­ter­na­ti­va.

Grazie a un’ef­fi­cien­za e a una per­for­man­ce ec­ce­zio­na­le, che si riflette anche nelle ap­pli­ca­zio­ni pro­gram­ma­te con questo lin­guag­gio, Go risulta una scelta in­te­res­san­te in par­ti­co­lar modo nell’ambito business e server. Maggiore è il codice da scrivere e compilare, più emergono i suoi vantaggi.

Per i neofiti della pro­gram­ma­zio­ne il processo di ap­pren­di­men­to è spesso più semplice, dato che be­ne­fi­cia­no della sem­pli­ci­tà di questo lin­guag­gio moderno, mentre per gli svi­lup­pa­to­ri esperti può risultare fru­stran­te a causa delle si­mi­li­tu­di­ni con C, Java e simili. Una volta che sono state superate le dif­fi­col­tà di orien­ta­men­to, anche i coder di vecchia data im­pa­re­ran­no ad ap­prez­za­re i vantaggi di Golang. Visto che il mercato di esperti Go non è ancora così grande, essere com­pe­ten­ti nel lin­guag­gio di pro­gram­ma­zio­ne di Google dà in ogni caso una grande op­por­tu­ni­tà, per esempio nel caso di una can­di­da­tu­ra per un posto come svi­lup­pa­to­re o per la rea­liz­za­zio­ne di un nuovo progetto.

Vai al menu prin­ci­pa­le