È stato rilasciato il linguaggio di programmazione Go 1.16, sviluppato da Google con la partecipazione della comunità, come una soluzione ibrida che unisce l'alta prestazione dei linguaggi compilati con i vantaggi dei linguaggi di scripting, come la facilità di scrittura del codice, la rapidità di sviluppo e la protezione dagli errori. Il codice del progetto è distribuito sotto licenza BSD.
La sintassi di Go si basa su elementi familiari del linguaggio C con alcuni prestiti dal linguaggio Python. Il linguaggio è abbastanza conciso, ma il codice è facile da leggere e comprendere. Il codice in Go viene compilato in file eseguibili binari autonomi, eseguiti nativamente senza l'uso di una macchina virtuale (i moduli di profilazione, debugging e altri sottosistemi di rilevamento problemi sono integrati come componenti runtime), permettendo così di raggiungere prestazioni paragonabili a quelle dei programmi in C.
Il progetto è stato inizialmente sviluppato tenendo conto della programmazione multithreading e dell'efficiente utilizzo di sistemi multicore, fornendo anche strumenti implementati a livello di operatore per organizzare calcoli paralleli e interazioni tra metodi eseguiti in parallelo. Il linguaggio offre anche strumenti integrati per proteggere dalla fuga di memoria e garantisce la possibilità di utilizzare un garbage collector.
Le principali novità introdotte nella versione Go 1.16:
- È stato aggiunto il pacchetto embed, che fornisce strumenti per incorporare file e directory nel programma. Per specificare i file da incorporare durante la compilazione, è disponibile una nuova direttiva «//go:embed». Ad esempio, specificando nel codice il commento «//go:embed test.txt» e dichiarando la variabile successivamente come «var f embed.FS», verrà effettuato l'incorporamento del file test.txt, consentendo l'accesso tramite il riferimento «f». In modo simile, è possibile incorporare i file necessari per il funzionamento o i singoli valori di un determinato tipo; ad esempio, per ottenere la variabile stringa «s» dal file version.txt, si può specificare: import _ «embed» //go:embed version.txt var s string print(s)
- Per impostazione predefinita, è ora richiesta l'uso del nuovo sistema di moduli con supporto integrato per il versioning, che sostituisce gli strumenti di gestione delle dipendenze basati su GOPATH. La variabile ambiente GO111MODULE è ora impostata su "on" per impostazione predefinita e la modalità moduli viene utilizzata indipendentemente dalla presenza del file go.mod nella directory di lavoro o nelle directory superiori. In questa nuova modalità, i comandi di build come "go build" e "go test" non modificano il contenuto di go.mod e go.sum, mentre il comando "go install" gestisce gli argomenti con specifiche di versione ("go install example.com/cmd@v1.0.0"). Per ripristinare il comportamento precedente, è necessario modificare GO111MODULE su "auto". Si segnala che il 96% degli sviluppatori ha già adottato il nuovo sistema di moduli.
- È stata ottimizzata l'operazione di linking. Per progetti di grandi dimensioni, il linking viene ora eseguito con un aumento della velocità del 20-25% e richiede dal 5 al 15% in meno di memoria.
- Il compilatore ha aggiunto il supporto per il deployment inline delle funzioni con definizioni semplificate dei cicli "for", valori dei metodi (method values) e costrutti 'type switch'.
- È stata aggiunta la compatibilità con i sistemi Apple dotati del nuovo chip ARM Apple M1. Sono stati aggiunti i porting netbsd/arm64 e openbsd/mips64 con supporto per NetBSD su ARM a 64 bit e OpenBSD su sistemi MIPS64. Nel porting linux/riscv64 è stata aggiunta la compatibilità cgo e la modalità “-buildmode=pie”.
- È stata interrotta la supporto per la modalità di compilazione x87 (GO386=387). Il supporto per i processori senza istruzioni SSE2 è ora disponibile tramite la modalità software “GO386=softfloat”.
Inoltre, si segnala l'inizio dei test della versione beta del linguaggio Dart 2.12, in cui è stata stabilizzata la modalità di uso sicuro del valore “Null” (null safety), che evita i crash causati dal tentativo di utilizzare variabili il cui valore non è definito e impostato su “Null”. Questa modalità implica che le variabili non possano avere valori indefiniti, a meno che non venga esplicitamente assegnato il valore null. In questa modalità i tipi delle variabili sono rigorosamente considerati, consentendo al compilatore di applicare ottimizzazioni aggiuntive. La corrispondenza dei tipi viene verificata durante la compilazione; ad esempio, nel caso di un tentativo di assegnare il valore “Null” a una variabile di un tipo che non consente uno stato indefinito, come “int”, verrà generato un errore.
Fonte: opennet.ru
