Skip to content

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

  1. Rimosso il concetto di tipi core (tipi fondamentali) dai generici, vedi il post ufficiale del blog Goodbye core types

Libreria standard

  1. Aggiunto test/synctest, utilizzato per testare codice concorrente
  2. 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/jsonbench
    • encoding/json/jsontext, fornisce capacità di interazione di basso livello con stringhe JSON

Toolchain

  1. Le distribuzioni future di Go includeranno una piccola quantità di strumenti binari precompilati
  2. go mod aggiunge il comando ignore, utilizzato per specificare le cartelle che il comando go dovrebbe ignorare
  3. go doc -http può avviare un server HTTP locale per visualizzare la documentazione del codice
  4. go vet, nuovi analizzatori waitgroup e hostport
  5. Quando la riga di comando go aggiorna la versione go in go.mod o go.work, non aggiunge più la versione della toolchain go specificata

Runtime

  1. GOMAXPROCS rileverà i limiti CPU del container negli ambienti containerizzati

  2. Nuova GC sperimentale greenteagc, l'unità di pianificazione di base della GC è passata da object a memory span

  3. Quando panic non viene catturato, non viene più stampato ripetutamente

    panic: PANIC [recovered]
      panic: PANIC

    diventa

    panic: PANIC [recovered, repanicked]
  4. Aggiunto runtime/trace.FlightRecorder, in grado di catturare le informazioni di esecuzione del runtime in modo più leggero

Compilatore

  1. 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

    go
    package 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)
    }
  2. Il compilatore riserva più memoria di backup per le slice sullo stack per migliorare le prestazioni

  3. 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

  1. 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

    go
    import (
        "other"
    )
    
    type MyQuque[T any] = other.Queue[T]

Libreria standard

  1. 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 è nil prima dell'uso
  2. Limitazioni di accesso al filesystem: introdotto il tipo os.Root, limita le operazioni sui file all'interno di directory specifiche, migliorando la sicurezza
  3. Supporto crittografico e hash: aggiunti i pacchetti crypto/mlkem, crypto/hkdf, crypto/pbkdf2 e crypto/sha3, ottimizzando le prestazioni degli algoritmi crittografici esistenti
  4. Aggiunta la funzione di benchmark testing.B.Loop per eseguire meglio i test con loop
  5. encoding/json: aggiunto il tag omitzero, supporta il filtraggio dei valori zero basato sul metodo IsZero()
  6. strings e bytes: aggiunte funzioni iteratore (come Lines, SplitSeq, FieldsSeq)

Runtime

  1. 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%
  2. sync.Map ora utilizza una hash-trie concorrente per ottimizzare le prestazioni, specialmente in caso di scrittura concorrente
  3. I mutex interni del runtime utilizzano una nuova implementazione spinbit, riducendo la contesa dei lock e migliorando le prestazioni in scenari ad alta concorrenza
  4. Ottimizzata la strategia di allocazione per oggetti piccoli, riducendo la frammentazione della memoria e le pause GC
  5. Aggiunto runtime.AddCleanup per sostituire runtime.SetFinalizer, supporta la registrazione di più funzioni di cleanup per un oggetto e l'esecuzione sequenziale in goroutine indipendenti

Cgo

  1. Supporto per le annotazioni #cgo noescape e #cgo nocallback, per dichiarare rispettivamente che le funzioni C non effettuano escape della memoria e non richiamano funzioni Go, migliorando le prestazioni del runtime
  2. 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) e void f(double)), evitando la generazione di sequenze di chiamata errate

Toolchain

  1. 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
  2. Output strutturato: go build e go test supportano il flag -json, producendo output di build e test in formato JSON
  3. 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)
  4. Vietato aggirare le limitazioni sulla definizione di metodi per tipi generati da CGO tramite alias
  5. go build incorpora automaticamente le informazioni del sistema di controllo versione nel file binario (supporta -buildvcs=false per disabilitare)
  6. La variabile d'ambiente GOAUTH supporta l'autenticazione per moduli privati.
  7. go.mod supporta la direttiva tool per gestire le dipendenze eseguibili, sostituendo l'importazione vuota tools.go
  8. Aggiunti il parametro go get -tool e il comando go install tool per gestire le dipendenze degli strumenti del modulo
  9. La cache di build supporta la cache binaria per go run e go tool
  10. objdump supporta la disassemblazione per LoongArch, RISC-V, S390X
  11. vet aggiunge l'analizzatore tests (rileva errori di firma nelle funzioni di test)

Compatibilità della piattaforma

  1. macOS: Go 1.24 sarà l'ultima versione a supportare macOS 11 Big Sur, Go 1.25 richiederà macOS 12+
  2. Windows: l'architettura ARM a 32 bit è contrassegnata come incompleta (GOOS=windows GOARCH=arm), vedi issue #70705
  3. Linux: la versione minima del kernel è aggiornata a 3.2
  4. Richiede Go 1.22.6+ come toolchain di bootstrap

Deprecazioni

  1. math/rand.Seed() è completamente inefficace, è necessario utilizzare GODEBUG=randseednop=0 per ripristinare il comportamento precedente.
  2. runtime.GOROOT() è contrassegnato come deprecato, si consiglia di ottenere il percorso tramite go 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

  1. for range supporta funzioni iteratore, per maggiori informazioni vedere Go Wiki: Rangefunc Experiment.

    go
    func 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 : GOLANG

    Questa è una funzionalità piuttosto pratica, generalmente utilizzata insieme ai generici.

Libreria standard

  1. Aggiunta la libreria standard iter, che definisce e descrive informazioni dettagliate sugli iteratori

  2. La libreria maps aggiunge diverse funzioni iteratore

  3. La libreria slices aggiunge diverse funzioni iteratore

  4. Aggiunta la libreria structs, che fornisce la capacità di modificare le proprietà dei struct, come il layout di memoria

    go
    type Person struct {
      Name string
      Age  int
      _    structs.HostLayout
    }
  5. Ottimizzata l'implementazione della libreria standard time

Linker

  1. Gestione dell'abuso di //go:linkname, per alcune API frequentemente referenziate è temporaneamente consentito il loro utilizzo, come runtime.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

  1. Aggiunto il comando go telemetry per 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

  1. Risolto il problema delle variabili di loop in Go

    go
    func 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.

  2. for range ora supporta l'iterazione su tipi numerici, come segue

    go
    for i := range 10 {
      fmt.Println(i)
    }

Libreria standard

  1. Migliorato il routing della libreria standard net/http

  2. database/sql aggiunge il tipo generico sql.Null

    go
    type Null[T any] struct {
      V     T
      Valid bool
    }

    Utilizzo come segue

    go
    type 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

  1. Aggiunte due funzioni built-in min e max, per calcolare il valore massimo e minimo.

  2. Aggiunta la funzione built-in clear, per svuotare map e slice

  3. Aggiornato 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
  4. Migliorata e affinata la capacità e la precisione dell'inferenza dei tipi, principalmente relativa ai generici.

  5. 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)

  6. Garantito che il valore di ritorno di recover non sarà nil. Se il parametro passato a panic è nil, verrà generato un altro panic, restituendo *runtime.PanicNilError. Per compatibilità, impostando GODEBUG=panicnil=1 a tempo di compilazione è consentito passare nil a panic.

Libreria standard

  1. Aggiunta la libreria log/slog, fornisce una libreria di logging strutturato standard
  2. Aggiunta la libreria testing/slogtest, utilizzata per verificare l'implementazione di slog.Handler
  3. Aggiunta la libreria slices, fornisce una serie di funzioni generiche per operare sulle slice.
  4. Aggiunta la libreria maps, fornisce una serie di funzioni generiche per operare sulle map
  5. Aggiunta la libreria cmp, utilizzata per confrontare tipi ordinabili.

Altro

  1. go1.21.0 richiede almeno Windows 10 o Windows Server 2016 o versioni successive sui sistemi Windows, le versioni precedenti non sono più supportate.
  2. go1.21.0 richiede almeno macOS 10.15 Catalina o versioni successive, le versioni precedenti non sono più supportate.
  3. Aggiunta un'interfaccia WebAssembly System Interface sperimentale, Go continua a esplorare l'ambito WASM.
  4. 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.pgo nel package main abilita questa funzionalità, che può migliorare le prestazioni del 2%-7%.
  5. 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.
  6. Ottimizzate le prestazioni delle chiamate CGO su piattaforme Unix, da 1-3 microsecondi a 100-200 nanosecondi.
  7. 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

  1. 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).
  2. unsafe aggiunge le funzioni SliceData, String, StringData, per costruire e manipolare slice e stringhe.

Libreria standard

  1. Aggiunta la libreria crypto/ecdh, fornisce supporto per ECDH (Elliptic Curve Diffie-Hellman, un metodo di crittografia asimmetrica).
  2. go1.20 estende il supporto per il wrapping degli error, consentendo a un error di incapsulare più error.
  3. Aggiunto net/http.ResponseController, fornisce un metodo più chiaro e facilmente individuabile per aggiungere controlli per handler.
  4. httputil.ReverseProxy include una nuova funzione Rewrite Hook per sostituire la precedente Director Hook.

Altro

  1. go1.20 è l'ultima versione a supportare Windows 7, 8, Server 2008 e Server 2012, il supporto non sarà disponibile nelle versioni future.
  2. go1.20 è l'ultima versione a supportare macOS 10.13 o 10.14, il supporto non sarà disponibile nelle versioni future.
  3. 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%.
  4. 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.
  5. In go1.20, il comando go disabilita cgo sui sistemi senza toolchain C.
  6. Supporto per la raccolta di file di copertura del codice, vedi Coverage profiling support for integration tests - The Go Programming Language
  7. 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

  1. Il modello di memoria si allinea a C/C++, simile a TcMollcate

  2. Il pacchetto sync/atomic ora fornisce più tipi utilizzabili

  3. Supporto per limitazioni soft della memoria Go tramite la funzione runtime/debug.SetMemoryLimit, che può fornire efficienza nell'utilizzo della memoria in alcune situazioni

  4. Il 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

  1. Aggiornamento importante, supporto per i generici, interfacce di tipi, vincoli di tipo per i parametri

Altro

  1. Ottimizzato il comportamento di espansione della funzione append
  2. Aggiunto il pacchetto debug/buildinfo, consente di ottenere informazioni di build del programma Go a runtime
  3. 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

  1. Aggiunta la funzione unsafe.Add, supporta l'aritmetica dei puntatori
  2. Aggiunta la funzione unsafe.Slice, supporta l'ottenimento del puntatore all'array sottostante di una slice
  3. 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

  1. Deprecato il pacchetto ioutil
  2. Supporto per incorporare file statici nel programma tramite la direttiva //go:embed
  3. 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

  1. Ottimizzata l'efficienza di allocazione per oggetti piccoli

  2. 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.

    go
    import _ "time/tzdata"
  3. Apportate importanti miglioramenti al linker Go, riducendo l'utilizzo delle risorse e migliorando la robustezza del codice

  4. In alcune situazioni, consente la conversione di unsafe.Pointer in uintptr

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

  1. Supporto per l'annidamento di tipi interfaccia di method set

    go
    type MyIO interface {
      io.WriteCloser
    }

Altro

  1. Grazie all'ottimizzazione open-coded, il costo delle chiamate defer è ridotto quasi come le chiamate native
  2. 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

  1. Supporto per literal numerici più moderni, ad esempio

    go
    0b101 // binario
    0o10 // ottale
    0x1B // esadecimale

    Supporto per underscore per separare i numeri per una migliore leggibilità

    go
    10_000

    Il suffisso i per i numeri immaginari può ora essere qualsiasi numero binario, ottale, esadecimale o floating-point

Altro

  1. Il valore di GO111MODULE è ora auto per impostazione predefinita
  2. Aggiunta la variabile d'ambiente GOPRIVATE per supportare sorgenti di dipendenze private
  3. Aggiunta la variabile d'ambiente GOSUMDB
  4. Il costo di utilizzo di defer è ridotto del 30%
  5. Quando si verifica un indice fuori limite, panic ora stampa le informazioni sull'indice
  6. 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

  1. Miglioramento significativo delle prestazioni di scansione dell'heap
  2. Il runtime rilascerà più attivamente la memoria richiesta al sistema operativo
  3. 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

  1. GoMod rilasciato per la prima volta, ponendo fine alla situazione caotica della gestione delle dipendenze
  2. Supporto sperimentale iniziale per WASM
  3. 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

  1. Il comando go install ora è utilizzato solo per installare e compilare strumenti da riga di comando, non più per scaricare dipendenze
  2. Il comando go get ora è utilizzato per scaricare dipendenze dal codice sorgente
  3. I test Go ora memorizzano nella cache i risultati dei test ed eseguono automaticamente go vet prima dell'esecuzione
  4. 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

  1. Supporto per alias di tipi

Altro

  1. Supporto per compilazione parallela
  2. Aggiunto sync.Map thread-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

  1. Quando due struct vengono convertiti, le differenze nei tag struct vengono ignorate

    go
    func 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

  1. 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)
  2. Il costo delle chiamate defer è ridotto di circa la metà
  3. Il costo delle chiamate Go verso C è ridotto di circa la metà
  4. 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

  1. golang.org/x/net/context aggiunto alla libreria standard
  2. Il tempo di compilazione gc è notevolmente ridotto rispetto a 1.6
  3. Il pacchetto testing supporta 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

  1. Rilevamento dell'uso concorrente delle map, se viene rilevato un uso concorrente di una map verrà generato un fatal
  2. Quando si verifica un panic, viene stampato solo lo stack di chiamate del goroutine in esecuzione
  3. 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

  1. Durante l'inizializzazione di literal di map, è consentito omettere il tipo degli elementi

    go
    m := 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

  1. Runtime e compilatore sono completamente riscritti in Go, non contengono più codice C
  2. Supporto per garbage collection concorrente, riducendo notevolmente il tempo di pausa del programma
  3. Il valore predefinito di GOMAXPROCS diventa il numero di core logici della macchina
  4. La semantica del pacchetto internal può essere applicata ovunque, non più limitata solo ai pacchetti sorgente Go
  5. 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

  1. Il loop for range può avere un solo parametro di iterazione, ad esempio

    for i := range x {
        ...
    }

    Ma non può averne zero

  2. Quando si chiama un metodo su un tipo a doppio riferimento, non viene più eseguito il dereferenziamento automatico

    go
    type T int
    func (T) M() {}
    var x **T
    
    // non consentito
    x.M()

Altro

  1. Prima di 1.4, il runtime di Go era scritto in C, ora è completamente scritto in Go
  2. Supporto per rinominare un pacchetto in internal per 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

  1. Il modello di stack dei goroutine è passato da segmented stack a continuous stack, migliorando le prestazioni di espansione dello stack.
  2. Migliorata la precisione del rilevamento dei puntatori del garbage collector
  3. L'iterazione su map di piccole dimensioni diventa imprevedibile nell'ordine
  4. 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

  1. Operare su una variabile con valore nil causerà un panic

  2. Quando 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

    go
    var array [10]int
    slice := array[2:4:4]

Altro

  1. La dimensione minima della memoria dello stack dei goroutine è aumentata da 4KB a 8KB

  2. Il numero massimo di thread è limitato a 10000

  3. 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

  1. Dividere un numero per 0 causava un panic prima, dalla versione 1.1 non passa più la compilazione.
  2. I metodi possono esistere come valori.
  3. Introduzione del concetto di terminating statement, le regole di return delle funzioni sono più flessibili, definizione di terminating statement - go-sepc.

Prestazioni

  1. I programmi Go compilati con gli strumenti di go1.1 possono migliorare le prestazioni di circa il 30%-40%

Altro:

  1. Il valore massimo della memoria heap sulle macchine a 64 bit è aumentato a diverse decine di GB
  2. 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

  1. Aggiunta la funzione built-in append, per aggiungere elementi alle slice

  2. Aggiunta la funzione built-in close, per chiudere i channel

  3. Semantica 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},
    }
  4. I goroutine utilizzati nella funzione init vengono avviati direttamente, senza attendere che tutti i pacchetti siano inizializzati.

  5. Aggiunto il tipo rune, rappresenta un carattere UTF-8

  6. Aggiunta l'interfaccia built-in error, rappresenta il tipo di errore

  7. Aggiunta la funzione built-in delete per rimuovere coppie chiave-valore dalle map

  8. L'ordine di iterazione delle map con for range diventa imprevedibile

  9. Supporto per l'assegnazione multipla di variabili

    a := 1
    b := 2
    a, b = 3, 4
  10. Problema di shadowing delle variabili: quando una funzione ha valori di ritorno nominati, se qualsiasi valore di ritorno viene nascosto, l'istruzione return deve includere i valori di ritorno, altrimenti la compilazione non riesce. Di seguito un esempio di errore

    go
    func 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.
    }
  11. Consentita la copia di valori struct con campi privati

  12. 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.

Golang by www.golangdev.cn edit