# Golang: il linguaggio di programmazione semplice di Google

È ormai risaputo che con il nome “Google” non ci si riferisce più solo a un motore di ricerca. L’**assortimento di prodotti** comprende servizi web utili come Google Maps, **piattaforme di entertainment** come YouTube e Google Music, **applicazioni di comunicazione** come Gmail, **soluzioni Office** come Google Docs e persino **hardware** come lo smartphone **Pixel**, ideato da Google. Inoltre la multinazionale fornisce da anni **utili tool per sviluppatori web e software**. A partire da marzo 2012 rientra nel portfolio dell’azienda anche il sempre più amato linguaggio di programmazione Go, conosciuto anche con il nome di Golang.

## Che cos’è Golang?

A settembre 2017 gli sviluppatori Robert Griesemer, Rob Pike e Ken Thompson, impiegati di Google, hanno formulato i loro obiettivi per un linguaggio di programmazione ottimizzato e semplificato, gettando le basi per Go o Golang. Quello che è **iniziato dapprima come un progetto più piccolo**, si è trasformato in fretta in un progetto ambizioso, il cui sviluppo Google ha **portato volutamente avanti**, mettendo a disposizione le risorse necessarie.

Dopo che Go alla fine del 2011 è stato ufficialmente presentato come **progetto open source** (licenza BSD), sono spuntati velocemente un gran numero di supporter nella community, che contribuiscono ancora oggi allo sviluppo e all’ottimizzazione del linguaggio di programmazione. 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 rilasciato aggiornamenti circa ogni 6 mesi.

Fatto La mascotte e il logo di Golang, una particolare specie di roditore del Nord America chiamata *Gopher*, sono stati ideati da **Renée French**, la cui creatività ha dato vita anche a Glenda, il [coniglio Plan 9](https://9p.io/plan9/glenda.html "Logo del coniglio Plan 9 su 9p.io"). Anche a questo sistema operativo UNIX di Bell Labs, sviluppato negli anni 80, hanno preso parte **Rob Pike** e **Ken Thompson**.

La sintassi di Golang è fortemente orientata alla **sintassi di base della famiglia C** ma mostra anche notevoli influenze provenienti dai linguaggi sviluppati 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** (***C**ommunicating **S**equential **P**rocesses*) di Tony Hoares.

Golang è compilabile, anche se si è concentrato sin dall’inizio nel garantire un’elevata velocità di conversione. Inoltre il linguaggio di programmazione dispone di una modalità automatica per la pulizia della memoria (in inglese *Garbage Collection* o abbreviato in *GC*), che si occupa in background di una **gestione ottimale delle risorse della memoria disponibili** e in questo modo impedisce l’insorgere di relativi problemi.

## Come si può classificare Golang tra i linguaggi di programmazione?

Sebbene Golang sia relativamente giovane rispetto agli altri linguaggi di programmazione, è stato già sviluppato sufficientemente e risulta così stabile da essere utilizzato dagli sviluppatori di tutto il mondo; persino lo stesso Google ricorre alle possibilità offerte da questo linguaggio di programmazione.

Golang si contraddistingue specialmente per la sua **semplicità e multifunzionalità** che gli sviluppatori avevano previsto sin dall’inizio. Infatti il nuovo linguaggio di programmazione nasce dall’insoddisfazione provocata dai rappresentanti affermati in questo settore che emergevano per una compilazione del codice efficiente o per una esecuzione veloce o ancora per un processo di programmazione semplice ma **senza presentare tutti e tre i vantaggi insieme**.

Tramite la combinazione di importanti feature tratte da diverse famiglie linguistiche, Golang dà in questo frangente il buon esempio: così la lingua di Google combina la **facilità di programmazione**, che contraddistingue il linguaggio interpretato e dinamico, con l’**efficienza e la sicurezza** di un linguaggio tipizzato e compilato in modo statico. In più la struttura di Go mira a consentire un **breve processo di sviluppo** che permette di creare anche file grandi ed eseguibili su un singolo computer **nel giro di pochi secondi**. Alcune delle caratteristiche 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 espressione ma leggero** per una classificazione e differenziazione ottimale dei diversi oggetti (variabili, funzioni, ecc.);
- la **concorrenza** (programmazione parallela) per un’esecuzione più veloce del programma;
- la già menzionata **pulizia automatica** (GC) per garantire un utilizzo ottimale della memoria disponibile e per evitare problemi correlati;
- una **specificazione rigida di dipendenze** senza una sintassi dichiarativa impegnativa;
- **l’uso su tutte le piattaforme**, consentendo così di utilizzare le applicazioni sviluppate su tutti i sistemi comuni.

## Programmare con Golang: le particolarità

La sintassi di Go si basa sulla classica sintassi di C, ma si differenzia dal linguaggio di programmazione, già sviluppato nel 1972, con una serie di piccoli miglioramenti e una **gamma di funzioni notevolmente ridotta**. Così, ad esempio, nella programmazione con Golang non è obbligatorio inserire le parentesi tonde nelle condizioni e nei cicli e **opzionalmente si può mettere il punto e virgola finale**, tipico dei linguaggi della famiglia C.

In aggiunta si può regolare la validità degli identificatori (i nomi degli elementi suddetti) attraverso il **modo di scrittura** (maiuscolo o minuscolo). Ad esempio se un identificatore deve essere attivo anche al di fuori di un determinato pacchetto Go, è necessario scrivere le prime lettere maiuscole. Di seguito vi elenchiamo altre **particolarità** della programmazione con Golang:

- **Ambiente GOPATH come base**: uno dei primi atti d’ufficio nella programmazione con Go consiste nel creare la directory GOPATH, comprensiva delle sottodirectory “**src**” (file sorgente Go), “**pkg**” (oggetti del pacchetto Go “*package objects*”) e “**bin**” (comandi eseguibili). Tutto il **codice Go** comprensivo di **dipendenze** si può gestire tramite questo ambiente di lavoro. La posizione di memorizzazione di questa directory obbligatoria GOPATH si può scegliere liberamente.
- **Struttura modulare con i pacchetti GOLANG** (*packages*): i file sorgente su Golang si possono organizzare 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 utilizzata la già citata scrittura maiuscola del corrispondente identificatore.
- **Formattazione del codice unitaria e consigliata**: Golang stabilisce determinate **convenzioni per la formattazione del codice**, ad esempio per l’intervallo esatto tra i singoli elementi. Quindi chi ha imparato a programmare applicazioni con Golang può anche leggere facilmente il codice di altri sviluppatori senza dover decifrare preventivamente il suo **stile di formattazione** personale, com’è il caso di molti altri linguaggi. Il formato non deve essere rispettato fin nel più piccolo dettaglio dal redattore: il tool integrato **gofmt ottimizza automaticamente il codice Golang**, risolvendo formattazioni errate.
- **Import relativi come standard**: tutti i file e i pacchetti che vengono importati nei progetti di Golang (autonomamente o da parte di terzi) sono sempre relativi alla cartella GOPATH/src rendendo così il **processo di importazione molto facile**. Inoltre Go non compila gli elementi importati se non vengono effettivamente utilizzati. In questo modo un **codice pulito** è garantito solo quando i componenti importati non vengono o non sono più utilizzati.
- **Valori di ritorno multipli per funzioni e metodi**: con Go si possono generare funzioni e metodi che possono **restituire più valori**. In questo modo Go può ad esempio separare in maniera pulita un risultato valido e un errore inserito alternativamente al momento della restituzione. Invece con C gli errori di scrittura vengono resi tramite un valore numerico negativo, mentre il codice di errore effettivo viene conservato separatamente.

## Punti di forza e campi di applicazione di Golang

Molti punti di forza elementari di Golang sono già stati esposti in questo articolo: per via della sua semplicità il linguaggio di Google, rispetto agli altri linguaggi di programmazione, risulta notevolmente **meno pesante per gli sviluppatori**. Chi ha interiorizzato i fondamenti approfitta del **semplice utilizzo** e degli **innumerevoli automatismi**, che comportano un notevole **risparmio di tempo**.

A questo scopo Go fornisce appositi software come ad esempio gofmt, che agisce autonomamente per l’**ottimizzazione automatica 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 è formattato sempre allo stesso modo, cosa che semplifica notevolmente la leggibilità generale e di conseguenza la **collaborazione nel team**.

[YouTube video](https://www.youtube.com/watch?v=ltikG7EkRoc)Un altro punto di forza che invoglia a programmare con Golang è la **buona performance** dimostrata da questo linguaggio di programmazione. La velocità di esecuzione delle applicazioni Go convince nel confronto generale con altri linguaggi di compilazione. **Così la velocità di compilazione corrisponde ad esempio approssimativamente a quella di Java**. Mentre molte applicazioni 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 utilizzano le **implementazioni già presenti nella libreria standard**, cosa che **accelera notevolmente il processo di avvio**.

Di conseguenza è meno sorprendente che Golang finora venga utilizzato soprattutto in ambienti aziendali e server, dove la stabilità e la performance dei servizi giocano un ruolo importante. In particolare nella **[virtualizzazione con i container](https://www.ionos.it/digitalguide/server/know-how/contenitori-un-nuovo-tipo-di-virtualizzazione/)** è richiesto questo linguaggio di programmazione giovane, cosa che in ultimo è da ricondurre al fatto che Docker, uno dei maggiori rappresentanti tra le piattaforme container, si basa su Go.

## Cosa può ancora imparare dagli altri linguaggi di programmazione?

Nonostante tutti gli elogi rivolti al moderno linguaggio di programmazione di Google, non deve ovviamente passare inosservati anche un paio di punti deboli. Questi sono principalmente da imputare alla **semplicità di Golang**, che pur essendo da una parte il suo maggiore punto di forza, dall’altra ne determina la **mancanza di determinate sfaccettature** che alcuni sviluppatori apprezzano negli altri linguaggi di programmazione.

Prima fra tutti è sicuramente da nominare la **mancanza di tipi generici** nella libreria standard, quindi non si ha la possibilità di inserire parametri personalizzati per i tipi di dati. Chi perciò è un sostenitore della **programmazione con i tipi** ed è ad esempio abituato all’**uso di Generics su Java**, per ora deve rinunciare a una feature simile su Go; tuttavia il team di Go non esclude l’implementazione di tipi generici in future versioni del linguaggio.

Molti sviluppatori avranno bisogno di un po’ di tempo per abituarsi alla rinuncia di classi, ereditarietà e costruttori. Un’altra feature di Go non sempre desiderata è rappresentata dalla **scomparsa automatica di file di importazione non attivi**. Altri linguaggi puntano in questo caso alla possibilità di “commentare” i corrispondenti componenti, di modo da mantenere invariato il codice di programmazione, malgrado l’inattività.

[YouTube video](https://www.youtube.com/watch?v=uzQeiNoUGkU)Un altro svantaggio di Golang rispetto ai linguaggi più antichi come C, C++ e simili trova le sue radici nella storia ancora molto recente del linguaggio. Così dispone di un **arsenale essenzialmente più piccolo di pacchetti** implementati in modo standard e pronti per l’importazione. Inoltre per Go si trovano in rete anche meno manuali, tutorial, ecc. rispetto ai linguaggi di programmazione affermati.

## Vantaggi e svantaggi di Golang a confronto

<table>
  <tbody>
    <tr>
      <td><strong>I punti di forza di Golang</strong></td>
      <td><strong>I punti deboli di Golang</strong></td>
    </tr>
    <tr>
      <td>Multipiattaforma</td>
      <td>Assenza di tipi generici</td>
    </tr>
    <tr>
      <td>Sintassi molto semplificata</td>
      <td>Orientata agli oggetti solo parzialmente</td>
    </tr>
    <tr>
      <td>Gestione automatica del processo di memorizzazione (Garbage Collection)</td>
      <td>Supporto di IDE (<strong>I</strong>ntegrated <strong>D</strong>evelopment <strong>E</strong>nvironments) da potenziare</td>
    </tr>
    <tr>
      <td>Formattazione unitaria del codice</td>
      <td>Offerta proporzionalmente ridotta di librerie e pacchetti offerti da terze parti</td>
    </tr>
    <tr>
      <td>Processo di importazione semplice</td>
      <td>Passaggio faticoso dai linguaggi di programmazione classici, orientati agli oggetti, come Java e C++</td>
    </tr>
    <tr>
      <td>Più valori di ritorno per funzioni e metodi</td>
      <td>Per ora pochi tutorial, esperti, ecc.</td>
    </tr>
    <tr>
      <td>Correzione del codice automatica (gofmt)</td>
      <td></td>
    </tr>
    <tr>
      <td>Concorrenza</td>
      <td></td>
    </tr>
    <tr>
      <td>Libreria standard ampia (specialmente per HTTP e compiti di rete)</td>
      <td></td>
    </tr>
  </tbody>
</table>

## Conclusione: a chi conviene imparare a utilizzare Golang?

Dopo aver messo in luce i fondamenti e le particolarità di questo linguaggio di programmazione open source in questo articolo, alla fine rimane soprattutto una domanda: chi dovrebbe prendersi la briga di imparare a programmare con Golang? Come spesso accade, anche in questo caso non si può dare una risposta unica e definitiva, poiché Go non si presenta come un sostituto di tutti i linguaggi di programmazione usati finora, ma come una **possibile alternativa**.

Grazie a un’**efficienza** e a una **performance eccezionale**, che si riflette anche nelle applicazioni programmate con questo linguaggio, Go risulta una scelta interessante in particolar modo nell’**ambito business e server**. Maggiore è il codice da scrivere e compilare, più emergono i suoi vantaggi.

Per i **neofiti della programmazione** il processo di apprendimento è spesso più semplice, dato che beneficiano della semplicità di questo linguaggio moderno, mentre per gli **sviluppatori esperti** può risultare frustrante a causa delle similitudini con C, Java e simili. Una volta che sono state superate le difficoltà di orientamento, anche i coder di vecchia data impareranno ad apprezzare i vantaggi di Golang. Visto che il mercato di esperti Go non è ancora così grande, essere competenti nel linguaggio di programmazione di Google dà in ogni caso una grande opportunità, per esempio nel caso di una candidatura per un posto come sviluppatore o per la realizzazione di un nuovo progetto.

[YouTube video](https://www.youtube.com/watch?v=OMhXJD54ZDM)


This is a markdown version of: [https://www.ionos.it/digitalguide/server/know-how/golang/](https://www.ionos.it/digitalguide/server/know-how/golang/) for AI/LLM consumption.