Note di Rilascio Go
Versioni di manutenzione:
- go1.25, primo rilascio: 2025-08-12, ultimo aggiornamento: go1.25.0 (2025-08-12)
- go1.24, primo rilascio: 2025-02-11, ultimo aggiornamento: go1.24.6 (2024-08-06)
Note di rilascio ufficiali del linguaggio Go: Release History - The Go Programming Language
Go adotta il versionamento semantico per l'identificazione delle versioni, nel formato vversione principale.versione secondaria.versione patch (vedi Semantic Versioning). Un aggiornamento della versione principale indica una Breaking Change, ovvero un aggiornamento non retrocompatibile. Gli aggiornamenti della versione secondaria indicano l'aggiunta di nuove funzionalità mantenendo la retrocompatibilità. Gli aggiornamenti della versione patch indicano correzioni di problemi mantenendo la retrocompatibilità.
Il team Go rilascia una versione secondaria ogni sei mesi, e solo le ultime due versioni secondarie sono mantenute a lungo termine, ciascuna per sei mesi. Considerando che ogni aggiornamento di Go mantiene un'elevata compatibilità, si consiglia di aggiornare Go alla versione più recente non appena la nuova versione si stabilizza.
L'ultima proposta per Go 2.0 risale al 19 novembre 2018, quando era ancora in versione go1.13. Cinque anni dopo, la versione è arrivata a go1.21 e le varie idee di Go 2.0 sono state incorporate in Go 1.0 attraverso aggiornamenti incrementali. Uno dei fondatori ha anche dichiarato esplicitamente che probabilmente non ci sarà un Go 2.0 in futuro, e Go continuerà a lavorare per mantenere la retrocompatibilità (vedi Go 1 and the Future of Go Programs).
Suggerimento
Questa pagina è semplicemente una traduzione delle note ufficiali, aggiornata irregolarmente. Per ottenere le ultime notizie, si prega di visitare il sito ufficiale.
1.25
Primo rilascio: 2025-08-12
Ultimo aggiornamento: go1.25.0 (2025-08-12)
Le note di rilascio dettagliate della versione go1.25 sono disponibili su Go 1.24 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.25 - Release Patch.
A livello di linguaggio
- Rimosso il concetto di tipi core (tipi fondamentali) dai generici, vedi il post ufficiale del blog Goodbye core types
Libreria standard
- Aggiunto
test/synctest, utilizzato per testare codice concorrente - Aggiunta la libreria sperimentale
encoding/json/v2, che include:encoding/json/v2, velocità di deserializzazione migliorata di 2-10 volte rispetto a v1, benchmark disponibili su go-json-experiment/jsonbenchencoding/json/jsontext, fornisce capacità di interazione di basso livello con stringhe JSON
Toolchain
- Le distribuzioni future di Go includeranno una piccola quantità di strumenti binari precompilati
- go mod aggiunge il comando
ignore, utilizzato per specificare le cartelle che il comando go dovrebbe ignorare go doc -httppuò avviare un server HTTP locale per visualizzare la documentazione del codice- go vet, nuovi analizzatori
waitgroupehostport - Quando la riga di comando go aggiorna la versione go in
go.modogo.work, non aggiunge più la versione della toolchain go specificata
Runtime
GOMAXPROCS rileverà i limiti CPU del container negli ambienti containerizzati
Nuova GC sperimentale
greenteagc, l'unità di pianificazione di base della GC è passata da object a memory spanQuando panic non viene catturato, non viene più stampato ripetutamente
panic: PANIC [recovered] panic: PANICdiventa
panic: PANIC [recovered, repanicked]Aggiunto
runtime/trace.FlightRecorder, in grado di catturare le informazioni di esecuzione del runtime in modo più leggero
Compilatore
Corretto il bug del controllo ritardato del puntatore nullo della versione 1.21 (ritardato dopo il controllo degli errori). Il seguente codice chiaramente problematico funzionava normalmente prima della versione 1.25
gopackage main import "os" func main() { f, err := os.Open("nonExistentFile") name := f.Name() if err != nil { println("should panic") // Prima di 1.25 verrebbe stampata questa riga return } println(name) }Il compilatore riserva più memoria di backup per le slice sullo stack per migliorare le prestazioni
Supporto per la generazione di informazioni di debug DWARF5
1.24
Primo rilascio: 2025-02-11
Ultimo aggiornamento: go1.24.6 (2025-08-06)
Le note di rilascio dettagliate della versione go1.24 sono disponibili su Go 1.24 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.24 - Release Patch.
A livello di linguaggio
Alias di tipi generici, consente di creare alias per tipi generici, utile quando si fa riferimento a tipi generici definiti da terze parti, ad esempio
goimport ( "other" ) type MyQuque[T any] = other.Queue[T]
Libreria standard
- Aggiunto il pacchetto
weak: fornisce puntatori deboli (Weak Pointers), consentendo il riferimento agli oggetti senza aumentare il conteggio dei riferimenti, evitando perdite di memoria causate dalla cache. È necessario verificare se il puntatore ènilprima dell'uso - Limitazioni di accesso al filesystem: introdotto il tipo
os.Root, limita le operazioni sui file all'interno di directory specifiche, migliorando la sicurezza - Supporto crittografico e hash: aggiunti i pacchetti
crypto/mlkem,crypto/hkdf,crypto/pbkdf2ecrypto/sha3, ottimizzando le prestazioni degli algoritmi crittografici esistenti - Aggiunta la funzione di benchmark
testing.B.Loopper eseguire meglio i test con loop encoding/json: aggiunto il tagomitzero, supporta il filtraggio dei valori zero basato sul metodoIsZero()stringsebytes: aggiunte funzioni iteratore (comeLines,SplitSeq,FieldsSeq)
Runtime
- Riscritte le map built-in basandosi su Swiss Tables, accesso alle mappe di grandi dimensioni migliorato del 30%, velocità di iterazione migliorata del 10%-60%
sync.Mapora utilizza una hash-trie concorrente per ottimizzare le prestazioni, specialmente in caso di scrittura concorrente- I mutex interni del runtime utilizzano una nuova implementazione spinbit, riducendo la contesa dei lock e migliorando le prestazioni in scenari ad alta concorrenza
- Ottimizzata la strategia di allocazione per oggetti piccoli, riducendo la frammentazione della memoria e le pause GC
- Aggiunto
runtime.AddCleanupper sostituireruntime.SetFinalizer, supporta la registrazione di più funzioni di cleanup per un oggetto e l'esecuzione sequenziale in goroutine indipendenti
Cgo
- Supporto per le annotazioni
#cgo noescapee#cgo nocallback, per dichiarare rispettivamente che le funzioni C non effettuano escape della memoria e non richiamano funzioni Go, migliorando le prestazioni del runtime - Cgo ora rifiuterà la compilazione di chiamate a funzioni C con più dichiarazioni incompatibili, rilevando rigorosamente le dichiarazioni incompatibili di funzioni C tra file (come
void f(int)evoid f(double)), evitando la generazione di sequenze di chiamata errate
Toolchain
- Gestione delle dipendenze degli strumenti: traccia le dipendenze degli strumenti tramite la direttiva tool di go.mod, sostituendo il tradizionale schema di importazione vuota tools.go
- Output strutturato: go build e go test supportano il flag -json, producendo output di build e test in formato JSON
- Ottimizzazioni di compilazione e linking: il compilatore genera codice più efficiente, il linker genera per impostazione predefinita GNU Build ID (piattaforme ELF) e UUID (macOS)
- Vietato aggirare le limitazioni sulla definizione di metodi per tipi generati da CGO tramite alias
go buildincorpora automaticamente le informazioni del sistema di controllo versione nel file binario (supporta-buildvcs=falseper disabilitare)- La variabile d'ambiente
GOAUTHsupporta l'autenticazione per moduli privati. go.modsupporta la direttivatoolper gestire le dipendenze eseguibili, sostituendo l'importazione vuotatools.go- Aggiunti il parametro
go get -toole il comandogo install toolper gestire le dipendenze degli strumenti del modulo - La cache di build supporta la cache binaria per
go runego tool objdumpsupporta la disassemblazione per LoongArch, RISC-V, S390Xvetaggiunge l'analizzatoretests(rileva errori di firma nelle funzioni di test)
Compatibilità della piattaforma
- macOS: Go 1.24 sarà l'ultima versione a supportare macOS 11 Big Sur, Go 1.25 richiederà macOS 12+
- Windows: l'architettura ARM a 32 bit è contrassegnata come incompleta (GOOS=windows GOARCH=arm), vedi issue #70705
- Linux: la versione minima del kernel è aggiornata a 3.2
- Richiede Go 1.22.6+ come toolchain di bootstrap
Deprecazioni
math/rand.Seed()è completamente inefficace, è necessario utilizzareGODEBUG=randseednop=0per ripristinare il comportamento precedente.runtime.GOROOT()è contrassegnato come deprecato, si consiglia di ottenere il percorso tramitego env GOROOT
1.23
Primo rilascio: 2024-08-13
Ultimo aggiornamento: go1.23.4 (2024-12-03)
Le note di rilascio dettagliate della versione go1.23 sono disponibili su Go 1.23 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.23 - Release Patch.
A livello di linguaggio
for range supporta funzioni iteratore, per maggiori informazioni vedere Go Wiki: Rangefunc Experiment.
gofunc Upper(s []string) iter.Seq2[int, string] { return func(yield func(int, string) bool) { for i, s1 := range s { if !yield(i, strings.ToUpper(s1)) { return } } return } } func main() { sl := []string{"hello", "world", "golang"} for i, s := range Upper(sl) { fmt.Printf("%d : %s\n", i, s) } } //0 : HELLO //1 : WORLD //2 : GOLANGQuesta è una funzionalità piuttosto pratica, generalmente utilizzata insieme ai generici.
Libreria standard
Aggiunta la libreria standard
iter, che definisce e descrive informazioni dettagliate sugli iteratoriLa libreria
mapsaggiunge diverse funzioni iteratoreLa libreria
slicesaggiunge diverse funzioni iteratoreAggiunta la libreria
structs, che fornisce la capacità di modificare le proprietà dei struct, come il layout di memoriagotype Person struct { Name string Age int _ structs.HostLayout }Ottimizzata l'implementazione della libreria standard
time
Linker
Gestione dell'abuso di
//go:linkname, per alcune API frequentemente referenziate è temporaneamente consentito il loro utilizzo, comeruntime.memhash64,runtime.nanotime, ecc. D'ora in poi non saranno consentiti altri nuovi riferimenti.go//go:linkname gcinit runtime.gcinit func gcinit() func main() { gcinit() }Codice come questo non può essere compilato
link: main: invalid reference to runtime.gcinit
Toolchain
- Aggiunto il comando
go telemetryper la gestione dei dati di telemetria
1.22
Primo rilascio: 2024-02-06
Ultimo aggiornamento: go1.22.6 (rilasciato il 2024-08-06)
Le note di rilascio dettagliate della versione go1.22 sono disponibili su Go 1.22 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.22 - Release Patch.
A livello di linguaggio
Risolto il problema delle variabili di loop in Go
gofunc main() { var wg sync.WaitGroup const n = 10 wg.Add(n) for i := 0; i < n; i++ { go func() { fmt.Println(i) wg.Done() }() } wg.Wait() }Questo codice prima di 1.22 avrebbe stampato 10 volte 9, dopo 1.22 stamperà correttamente da 0 a 9.
for rangeora supporta l'iterazione su tipi numerici, come seguegofor i := range 10 { fmt.Println(i) }
Libreria standard
Migliorato il routing della libreria standard
net/httpdatabase/sqlaggiunge il tipo genericosql.Nullgotype Null[T any] struct { V T Valid bool }Utilizzo come segue
gotype Person struct { Name sql.Null[string] Age sql.Null[int] }
1.21
Primo rilascio: 2023-08-08
Ultimo aggiornamento: go1.21.13 (rilasciato il 2024-08-06)
Le note di rilascio dettagliate della versione go1.21 sono disponibili su Go 1.21 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.21 - Release Patch.
A livello di linguaggio
Aggiunte due funzioni built-in
minemax, per calcolare il valore massimo e minimo.Aggiunta la funzione built-in
clear, per svuotare map e sliceAggiornato l'ordine di inizializzazione dei
package- Ordina tutti i package per percorso di importazione
- Ripeti fino a quando l'elenco dei package è vuoto
- Trova il primo package nell'elenco le cui importazioni sono state tutte inizializzate
- Inizializza il package e rimuovilo dall'elenco
Migliorata e affinata la capacità e la precisione dell'inferenza dei tipi, principalmente relativa ai generici.
Lanciata la versione di anteprima del miglioramento delle variabili di loop
for range, un problema che ha afflitto gli sviluppatori Go per quasi un decennio. L'ufficialità sta finalmente risolvendo il problema, per i dettagli vedere: LoopvarExperiment · golang/go Wiki (github.com) e Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)Garantito che il valore di ritorno di
recovernon sarànil. Se il parametro passato apanicènil, verrà generato un altropanic, restituendo*runtime.PanicNilError. Per compatibilità, impostandoGODEBUG=panicnil=1a tempo di compilazione è consentito passarenilapanic.
Libreria standard
- Aggiunta la libreria
log/slog, fornisce una libreria di logging strutturato standard - Aggiunta la libreria
testing/slogtest, utilizzata per verificare l'implementazione dislog.Handler - Aggiunta la libreria
slices, fornisce una serie di funzioni generiche per operare sulle slice. - Aggiunta la libreria
maps, fornisce una serie di funzioni generiche per operare sulle map - Aggiunta la libreria
cmp, utilizzata per confrontare tipi ordinabili.
Altro
- go1.21.0 richiede almeno Windows 10 o Windows Server 2016 o versioni successive sui sistemi Windows, le versioni precedenti non sono più supportate.
- go1.21.0 richiede almeno macOS 10.15 Catalina o versioni successive, le versioni precedenti non sono più supportate.
- Aggiunta un'interfaccia WebAssembly System Interface sperimentale, Go continua a esplorare l'ambito WASM.
- Ciò che era sperimentale in 1.20, l'ottimizzazione guidata dal profilo (PGO) (vedi Profile-guided optimization - The Go Programming Language), è ufficialmente abilitato nella versione 1.21. La presenza del file
default.pgonel package main abilita questa funzionalità, che può migliorare le prestazioni del 2%-7%. - Quando si stampa uno stack di chiamate runtime molto profondo, invece di stampare solo i primi cento frame, ora vengono stampati rispettivamente i primi 50 e gli ultimi 50 frame.
- Ottimizzate le prestazioni delle chiamate CGO su piattaforme Unix, da 1-3 microsecondi a 100-200 nanosecondi.
- Nella versione 1.21, la velocità di compilazione è migliorata di circa il 6%, principalmente grazie all'uso di PGO da parte del compilatore stesso per la compilazione.
1.20
Primo rilascio: 2023-02-01
Ultimo aggiornamento: go1.20.14 (rilasciato il 2024-02-06)
Le note di rilascio dettagliate della versione go1.20 sono disponibili su Go 1.20 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.20 - Release Patch.
A livello di linguaggio
- Quando si converte un tipo slice in un array, prima era necessario dereferenziare l'array di puntatori
*(*[4byte])(x)per evitare di condividere lo stesso array sottostante con la slice, ora si può scrivere direttamente[4]byte(x). unsafeaggiunge le funzioniSliceData,String,StringData, per costruire e manipolare slice e stringhe.
Libreria standard
- Aggiunta la libreria
crypto/ecdh, fornisce supporto per ECDH (Elliptic Curve Diffie-Hellman, un metodo di crittografia asimmetrica). - go1.20 estende il supporto per il wrapping degli error, consentendo a un error di incapsulare più error.
- Aggiunto
net/http.ResponseController, fornisce un metodo più chiaro e facilmente individuabile per aggiungere controlli per handler. httputil.ReverseProxyinclude una nuova funzione Rewrite Hook per sostituire la precedente Director Hook.
Altro
- go1.20 è l'ultima versione a supportare Windows 7, 8, Server 2008 e Server 2012, il supporto non sarà disponibile nelle versioni future.
- go1.20 è l'ultima versione a supportare macOS 10.13 o 10.14, il supporto non sarà disponibile nelle versioni future.
- Nelle versioni 1.18 e 1.19, a causa dell'introduzione dei generici, la velocità di compilazione è regredita rispetto a 1.17. La velocità di compilazione di go1.20 migliorerà di circa il 10%.
- Rilasciata la versione di anteprima di PGO (Profile-guided optimization), una tecnica di ottimizzazione del compilatore nel mondo informatico che può migliorare le prestazioni di runtime.
- In go1.20, il comando go disabilita cgo sui sistemi senza toolchain C.
- Supporto per la raccolta di file di copertura del codice, vedi Coverage profiling support for integration tests - The Go Programming Language
- Miglioramenti alla GC, maggiore stabilità, riduzione del consumo di memoria, miglioramento delle prestazioni CPU del 2% complessivo.
1.19
Primo rilascio: 2022-08-02
Ultimo aggiornamento: go1.19.13 (rilasciato il 2023-09-06)
Le note di rilascio dettagliate della versione go1.19 sono disponibili su Go 1.19 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.19 - Release Patch.
Cambiamenti importanti
Il modello di memoria si allinea a C/C++, simile a TcMollcate
Il pacchetto
sync/atomicora fornisce più tipi utilizzabiliSupporto per limitazioni soft della memoria Go tramite la funzione
runtime/debug.SetMemoryLimit, che può fornire efficienza nell'utilizzo della memoria in alcune situazioniIl runtime ora seleziona una dimensione appropriata per inizializzare lo spazio di memoria dello stack del goroutine in base all'utilizzo medio dello stack, evitando frequenti espansioni e contrazioni dello stack
1.18
Primo rilascio: 2022-03-15
Ultimo aggiornamento: go1.18.10 (rilasciato il 2023-01-10)
Le note di rilascio dettagliate della versione go1.18 sono disponibili su Go 1.18 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.18 - Release Patch.
A livello di linguaggio
- Aggiornamento importante, supporto per i generici, interfacce di tipi, vincoli di tipo per i parametri
Altro
- Ottimizzato il comportamento di espansione della funzione
append - Aggiunto il pacchetto
debug/buildinfo, consente di ottenere informazioni di build del programma Go a runtime - gofmt ora può formattare i file sorgente in modo concorrente
1.17
Primo rilascio: 2021-08-16
Ultimo aggiornamento: go1.17.13 (rilasciato il 2022-08-01)
Le note di rilascio dettagliate della versione go1.17 sono disponibili su Go 1.17 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.17 - Release Patch.
A livello di linguaggio
- Aggiunta la funzione
unsafe.Add, supporta l'aritmetica dei puntatori - Aggiunta la funzione
unsafe.Slice, supporta l'ottenimento del puntatore all'array sottostante di una slice - Le slice ora possono essere convertite in tipi puntatore ad array,
[]T => *[N]T, a condizione che la lunghezza dell'array sia minore o uguale alla lunghezza della slice
1.16
Primo rilascio: 2021-02-16
Ultimo aggiornamento: go1.16.15 (rilasciato il 2022-03-03)
Le note di rilascio dettagliate della versione go1.16 sono disponibili su Go 1.16 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.16 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti importanti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
- Deprecato il pacchetto
ioutil - Supporto per incorporare file statici nel programma tramite la direttiva
//go:embed - Aggiunto il tipo
io/fs.Fs, migliore astrazione del filesystem
1.15
Primo rilascio: 2020-08-11
Ultimo aggiornamento: go1.15.15 (rilasciato il 2021-08-05)
Le note di rilascio dettagliate della versione go1.15 sono disponibili su Go 1.15 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.15 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti importanti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
Ottimizzata l'efficienza di allocazione per oggetti piccoli
Aggiunto il pacchetto
time/tzdata, supporta l'incorporamento del database dei fusi orari nel programma come segue, poiché molti sistemi non hanno informazioni sui fusi orari locali.goimport _ "time/tzdata"Apportate importanti miglioramenti al linker Go, riducendo l'utilizzo delle risorse e migliorando la robustezza del codice
In alcune situazioni, consente la conversione di
unsafe.Pointerinuintptr
1.14
Primo rilascio: 2020-02-25
Ultimo aggiornamento: go1.14.15 (rilasciato il 2021-02-04)
Le note di rilascio dettagliate della versione go1.14 sono disponibili su Go 1.14 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.14 - Release Patch.
A livello di linguaggio
Supporto per l'annidamento di tipi interfaccia di method set
gotype MyIO interface { io.WriteCloser }
Altro
- Grazie all'ottimizzazione open-coded, il costo delle chiamate
deferè ridotto quasi come le chiamate native - Supporto per il preemption asincrono tra goroutine, i loop senza chiamate di funzione non bloccheranno più permanentemente lo scheduler
1.13
Primo rilascio: 2019-09-03
Ultimo aggiornamento: go1.13.15 (rilasciato il 2020-08-06)
Le note di rilascio dettagliate della versione go1.13 sono disponibili su Go 1.13 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.13 - Release Patch.
A livello di linguaggio
Supporto per literal numerici più moderni, ad esempio
go0b101 // binario 0o10 // ottale 0x1B // esadecimaleSupporto per underscore per separare i numeri per una migliore leggibilità
go10_000Il suffisso
iper i numeri immaginari può ora essere qualsiasi numero binario, ottale, esadecimale o floating-point
Altro
- Il valore di
GO111MODULEè oraautoper impostazione predefinita - Aggiunta la variabile d'ambiente
GOPRIVATEper supportare sorgenti di dipendenze private - Aggiunta la variabile d'ambiente
GOSUMDB - Il costo di utilizzo di
deferè ridotto del 30% - Quando si verifica un indice fuori limite,
panicora stampa le informazioni sull'indice - Go esegue la verifica della versione semantica quando scarica le dipendenze
1.12
Primo rilascio: 2019-02-25
Ultimo aggiornamento: go1.12.17 (rilasciato il 2020-02-12)
Le note di rilascio dettagliate della versione go1.12 sono disponibili su Go 1.12 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.12 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti importanti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
- Miglioramento significativo delle prestazioni di scansione dell'heap
- Il runtime rilascerà più attivamente la memoria richiesta al sistema operativo
- Il comando per scaricare le dipendenze Go può ora essere utilizzato in modo sicuro e concorrente
1.11
Primo rilascio: 2018-08-24
Ultimo aggiornamento: go1.11.13 (rilasciato il 2019-08-13)
Le note di rilascio dettagliate della versione go1.11 sono disponibili su Go 1.11 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.11 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti importanti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
- GoMod rilasciato per la prima volta, ponendo fine alla situazione caotica della gestione delle dipendenze
- Supporto sperimentale iniziale per WASM
- Il runtime utilizza una disposizione sparsa dell'heap, non limitando più la dimensione dell'heap
1.10
Primo rilascio: 2018-02-16
Ultimo aggiornamento: go1.10.8 (rilasciato il 2019-01-23)
Le note di rilascio dettagliate della versione go1.10 sono disponibili su Go 1.10 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.10 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti importanti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
- Il comando
go installora è utilizzato solo per installare e compilare strumenti da riga di comando, non più per scaricare dipendenze - Il comando
go getora è utilizzato per scaricare dipendenze dal codice sorgente - I test Go ora memorizzano nella cache i risultati dei test ed eseguono automaticamente
go vetprima dell'esecuzione - Riduzione significativa della latenza causata dalla GC durante l'attività
1.9
Primo rilascio: 2017-08-24
Ultimo aggiornamento: go1.9.7 (rilasciato il 2018-06-05)
Le note di rilascio dettagliate della versione go1.9 sono disponibili su Go 1.9 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.9 - Release Patch.
A livello di linguaggio
- Supporto per alias di tipi
Altro
- Supporto per compilazione parallela
- Aggiunto
sync.Mapthread-safe
1.8
Primo rilascio: 2017-02-16
Ultimo aggiornamento: go1.8.7 (rilasciato il 2018-02-07)
Le note di rilascio dettagliate della versione go1.8 sono disponibili su Go 1.8 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.8 - Release Patch.
A livello di linguaggio
Quando due struct vengono convertiti, le differenze nei tag struct vengono ignorate
gofunc example() { type T1 struct { X int `json:"foo"` } type T2 struct { X int `json:"bar"` } var v1 T1 var v2 T2 v1 = T1(v2) // ora legale }
Altro
- Il tempo di pausa causato dal garbage collector è basso fino a 10 microsecondi, nella maggior parte dei casi inferiore a 100 microsecondi (si può vedere che quasi ogni versione Go cerca di migliorare la GC)
- Il costo delle chiamate
deferè ridotto di circa la metà - Il costo delle chiamate Go verso C è ridotto di circa la metà
- Ottimizzato il rilevamento dell'uso concorrente delle map
1.7
Primo rilascio: 2016-08-15
Ultimo aggiornamento: go1.7.6 (rilasciato il 2017-05-23)
Le note di rilascio dettagliate della versione go1.7 sono disponibili su Go 1.7 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.7 - Release Patch.
Cambiamenti importanti
golang.org/x/net/contextaggiunto alla libreria standard- Il tempo di compilazione gc è notevolmente ridotto rispetto a 1.6
- Il pacchetto
testingsupporta i sub-test
1.6
Primo rilascio: 2016-02-17
Ultimo aggiornamento: go1.6.4 (rilasciato il 2016-12-01)
Le note di rilascio dettagliate della versione go1.6 sono disponibili su Go 1.6 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.6 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti a livello di sintassi, di seguito i cambiamenti più importanti
- Rilevamento dell'uso concorrente delle map, se viene rilevato un uso concorrente di una map verrà generato un
fatal - Quando si verifica un
panic, viene stampato solo lo stack di chiamate del goroutine in esecuzione - Supporto per HTTP/2
1.5
Primo rilascio: 2015-08-19
Ultimo aggiornamento: go1.5.4 (rilasciato il 2016-04-12)
Le note di rilascio dettagliate della versione go1.5 sono disponibili su Go 1.5 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.5 - Release Patch.
A livello di linguaggio
Durante l'inizializzazione di literal di map, è consentito omettere il tipo degli elementi
gom := map[Point]string{ Point{29.935523, 52.891566}: "Persepolis", Point{-25.352594, 131.034361}: "Uluru", Point{37.422455, -122.084306}: "Googleplex", } // omettendo il tipo m := map[Point]string{ {29.935523, 52.891566}: "Persepolis", {-25.352594, 131.034361}: "Uluru", {37.422455, -122.084306}: "Googleplex", }
Altro
- Runtime e compilatore sono completamente riscritti in Go, non contengono più codice C
- Supporto per garbage collection concorrente, riducendo notevolmente il tempo di pausa del programma
- Il valore predefinito di
GOMAXPROCSdiventa il numero di core logici della macchina - La semantica del pacchetto
internalpuò essere applicata ovunque, non più limitata solo ai pacchetti sorgente Go - Supporto sperimentale per la gestione delle dipendenze vendor (finalmente si inizia ad affrontare la gestione delle dipendenze)
1.4
Primo rilascio: 2014-12-10
Ultimo aggiornamento: go1.4.3 (rilasciato il 2015-09-22)
Le note di rilascio dettagliate della versione go1.4 sono disponibili su Go 1.4 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.4 - Release Patch.
A livello di linguaggio
Il loop
for rangepuò avere un solo parametro di iterazione, ad esempiofor i := range x { ... }Ma non può averne zero
Quando si chiama un metodo su un tipo a doppio riferimento, non viene più eseguito il dereferenziamento automatico
gotype T int func (T) M() {} var x **T // non consentito x.M()
Altro
- Prima di 1.4, il runtime di Go era scritto in C, ora è completamente scritto in Go
- Supporto per rinominare un pacchetto in
internalper indicare che tutto il contenuto di quel pacchetto è privato e non esportabile
1.3
Primo rilascio: 2014-06-18
Ultimo aggiornamento: go1.3.3 (rilasciato il 2014-09-30)
Le note di rilascio dettagliate della versione go1.3 sono disponibili su Go 1.3 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.3 - Release Patch.
Cambiamenti importanti
Questa versione non presenta cambiamenti a livello di sintassi, alcuni cambiamenti importanti sono i seguenti
- Il modello di stack dei goroutine è passato da segmented stack a continuous stack, migliorando le prestazioni di espansione dello stack.
- Migliorata la precisione del rilevamento dei puntatori del garbage collector
- L'iterazione su map di piccole dimensioni diventa imprevedibile nell'ordine
- Grazie ad alcuni miglioramenti del runtime, le prestazioni dei programmi Go di questa versione sono migliorate notevolmente
1.2
Primo rilascio: 2013-12-01
Ultimo aggiornamento: go1.2.2 (rilasciato il 2014-05-05)
Le note di rilascio dettagliate della versione go1.2 sono disponibili su Go 1.2 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.2 - Release Patch.
A livello di linguaggio
Operare su una variabile con valore
nilcauserà unpanicQuando si effettua lo slicing di una slice, è possibile utilizzare un terzo parametro per limitare la capacità della slice risultante per un utilizzo più sicuro delle slice
govar array [10]int slice := array[2:4:4]
Altro
La dimensione minima della memoria dello stack dei goroutine è aumentata da 4KB a 8KB
Il numero massimo di thread è limitato a 10000
I goroutine in esecuzione prolungata vengono preempti durante le chiamate di funzione (prima introduzione del preemption collaborativo)
1.1
Primo rilascio: 2013-05-13
Ultimo aggiornamento: go1.1.2 (rilasciato il 2013-08-13)
Le note di rilascio dettagliate della versione go1.1 sono disponibili su Go 1.1 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.1 - Release Patch.
A livello di linguaggio
- Dividere un numero per 0 causava un
panicprima, dalla versione 1.1 non passa più la compilazione. - I metodi possono esistere come valori.
- Introduzione del concetto di terminating statement, le regole di return delle funzioni sono più flessibili, definizione di terminating statement - go-sepc.
Prestazioni
- I programmi Go compilati con gli strumenti di go1.1 possono migliorare le prestazioni di circa il 30%-40%
Altro:
- Il valore massimo della memoria heap sulle macchine a 64 bit è aumentato a diverse decine di GB
- La compilazione incrociata disabilita cgo per impostazione predefinita
1.0
Primo rilascio: 2012-03-28
Le note di rilascio dettagliate della versione go1.0 sono disponibili su Go 1.0 Release Notes. Tutte le versioni patch rilasciate durante il suo periodo di manutenzione sono disponibili su Go1.0 - Release Patch.
A livello di linguaggio
Rispetto alla versione di anteprima, la sintassi ha aggiunto le seguenti cose
Aggiunta la funzione built-in
append, per aggiungere elementi alle sliceAggiunta la funzione built-in
close, per chiudere i channelSemantica composita, durante l'inizializzazione di elementi di slice, map e literal struct, è possibile omettere il tipo, come mostrato di seguito
go// dichiarando il tipo holiday1 := []Date{ Date{"Feb", 14}, Date{"Nov", 11}, Date{"Dec", 25}, } // omettendo il tipo holiday2 := []Date{ {"Feb", 14}, {"Nov", 11}, {"Dec", 25}, }I goroutine utilizzati nella funzione
initvengono avviati direttamente, senza attendere che tutti i pacchetti siano inizializzati.Aggiunto il tipo
rune, rappresenta un carattere UTF-8Aggiunta l'interfaccia built-in
error, rappresenta il tipo di erroreAggiunta la funzione built-in
deleteper rimuovere coppie chiave-valore dalle mapL'ordine di iterazione delle map con
for rangediventa imprevedibileSupporto per l'assegnazione multipla di variabili
a := 1 b := 2 a, b = 3, 4Problema di shadowing delle variabili: quando una funzione ha valori di ritorno nominati, se qualsiasi valore di ritorno viene nascosto, l'istruzione
returndeve includere i valori di ritorno, altrimenti la compilazione non riesce. Di seguito un esempio di erroregofunc Bug() (i, j, k int) { for i = 0; i < 5; i++ { for j := 0; j < 5; j++ { // Ridefinisce j. k += i * j if k > 100 { return // Rifiutato: j è nascosto qui. } } } return // OK: j non è nascosto qui. }Consentita la copia di valori struct con campi privati
Quando struct e slice sono composti da elementi comparabili, è consentito utilizzarli come chiavi di map, rimuovendo contemporaneamente la comparabilità di funzioni e map
Oltre al livello linguistico, go1.0 presenta cambiamenti molto significativi rispetto alla versione di anteprima nell'organizzazione dei pacchetti, nella libreria standard e negli strumenti da riga di comando. Poiché il contenuto è troppo ampio, non verrà trattato ulteriormente qui. Chi è interessato può consultare il sito ufficiale.
pre
Prima del rilascio ufficiale di go1, tutte le versioni erano chiamate versioni di anteprima. Per queste versioni di anteprima, l'ufficialità rilasciava una versione snapshot ogni settimana. Le versioni più importanti includono
- r60 (2011-09-07), stabilisce che i blocchi else devono ora avere parentesi
- r59 (2011-08-01), progettato un nuovo schema per i tag struct
- r58 (2011-06-29), corretto il problema di memoria non inizializzata causato dall'abuso di goto, aggiunti i pacchetti gui ed exec
- r57 (2011-05-03), supporto per la sintassi di assegnazione multipla con variabili brevi, riprogettati i pacchetti http e reflect, gotest come programma Go anziché script shell
- r56 (2011-03-07), prima versione stabile
Lo sviluppo delle versioni di anteprima è iniziato il 9 dicembre 2009 e si è interrotto dopo il rilascio ufficiale di go1 il 28 marzo 2012, durando quasi tre anni. D'ora in poi non verranno più registrate le versioni snapshot settimanali. Per informazioni su queste versioni principali, vedere Pre-Go 1 Release History. Per informazioni su tutte le versioni snapshot settimanali delle versioni di anteprima, vedere Weekly Snapshot History.
