Il nuovo rilascio del linguaggio Go, versione 1.24, esce sei mesi dopo Go 1.23. La maggior parte delle modifiche riguardano l'implementazione degli strumenti, del runtime e delle librerie. Come sempre, il rilascio garantisce l'impegno alla compatibilità Go 1. Gli sviluppatori del linguaggio si aspettano che quasi tutti i programmi Go continuino a compilarsi e a funzionare come prima.
Modifiche al linguaggio
Go 1.24 ora supporta completamente gli alias di tipo generici: un alias di tipo può essere parametrizzato come un tipo dichiarato. Maggiori dettagli nella specifica del linguaggio. Attualmente, questa funzionalità può essere disattivata impostando GOEXPERIMENT=noaliastypeparams; tuttavia, l'opzione aliastypeparams sarà rimossa in Go 1.25.
Strumenti
Il comando go
I moduli go ora possono tracciare le dipendenze eseguibili utilizzando la direttiva tool in go.mod. Ciò elimina la necessità di una precedente soluzione alternativa che prevedeva l'aggiunta di strumenti come importazioni vuote nel file, comunemente chiamato “tools.go”. Il comando go tool ora può eseguire questi strumenti oltre agli strumenti forniti con Go. Maggiori informazioni possono essere trovate in documentazione.
Il nuovo flag -tool per go get consente di aggiungere la direttiva dello strumento nel modulo corrente per i pacchetti specificati, oltre a integrare le direttive richieste.
Nuovo meta-pattern tool si riferisce a tutti gli strumenti nel modulo corrente. Può essere utilizzato per aggiornare tutti tramite go get tool o per installarli nella propria directory GOBIN tramite go install tool.
I file eseguibili creati tramite go run e il nuovo comportamento di go tool ora vengono memorizzati nella cache della build di Go. Questo rende le esecuzioni ripetute più veloci grazie alla cache incrementata. #69290.
I comandi go build e go install ora accettano il flag -json, che segnala l'output e gli errori di build come output strutturato JSON nel flusso standard. I dettagli del formato possono essere visualizzati in go help buildjson.
Inoltre, go test -json ora segnala l'output e gli errori di build in JSON, mescolati con il JSON dei risultati dei test. Possono essere distinti attraverso nuovi tipi di Action, ma se causano problemi nel sistema di integrazione dei test, è possibile tornare all'output testuale di build mediante l'impostazione GODEBUG gotestjsonbuildtext=1.
La nuova variabile d'ambiente GOAUTH offre un modo flessibile per autorizzare il caricamento privato dei moduli. Puoi trovare ulteriori dettagli in go help goauth.
Il comando go build ora installa la versione principale del modulo nel binario compilato, basandosi sul tag e/o sul commit del sistema di controllo versione. Il suffisso +dirty verrà aggiunto se ci sono modifiche non commesse. Puoi utilizzare il flag -buildvcs=false per omettere le informazioni sul controllo versione dal binario.
Nuova la configurazione GODEBUG toolchaintrace=1 può ora essere utilizzata per tracciare il processo di selezione della toolchain nel comando go.
Cgo
Cgo supporta nuove annotazioni per le funzioni C per migliorare le prestazioni a tempo di esecuzione. #cgo noescape cFunctionName indica al compilatore che la memoria passata alla funzione C cFunctionName non esce. #cgo nocallback cFunctionName indica al compilatore che la funzione C cFunctionName non richiama alcuna funzione Go. Maggiori informazioni possono essere trovate nella documentazione cgo.
Cgo attualmente rifiuta di compilare le chiamate a una funzione C che ha più dichiarazioni incompatibili. Ad esempio, se f è dichiarato sia come void f(int) sia come void f(double), cgo restituirà un errore invece di generare una sequenza di chiamate errata f(0). Nuovo in questa versione è il miglioramento nel rilevamento di questa condizione di errore, quando le dichiarazioni incompatibili compaiono in file diversi. #67699.
Objdump
Lo strumento objdump ora supporta il disassemblaggio su architetture a 64 bit LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) e S390X (GOARCH=s390x).
Vet
Il nuovo analizzatore tests segnala errori comuni nelle dichiarazioni di test, fuzzers, benchmark ed esempi nei pacchetti di test, come nomi malformati, firme errate o esempi che documentano identificatori inesistenti. Alcuni di questi errori possono portare al fallimento dei test.
L'analizzatore printf esistente ora fornisce diagnostica per le chiamate con il formato fmt.Printf(s), dove s è una stringa di formato non costante, senza altri argomenti. Tali chiamate sono quasi sempre un errore, poiché il valore di s può contenere il simbolo %; invece, usa fmt.Print. 60529. Questo controllo tende a fare scoperte nel codice esistente, quindi viene applicato solo quando la versione del linguaggio (come specificato dalla direttiva del file go.mod o dai commenti `//go:build`) è almeno Go 1.24, per evitare malfunzionamenti nell'integrazione continua durante l'aggiornamento alla toolchain Go 1.24.
L'analizzatore buildtag esistente ora fornisce diagnostica quando c'è un'informazione errata sulle restrizioni di build di versioni precedenti di Go nella direttiva //go:build. Ad esempio, //go:build go1.23.1 fa riferimento a un rilascio patch; invece, usa //go:build go1.23. #64127.
L'analizzatore copylock esistente ora fornisce diagnostica quando una variabile dichiarata in un ciclo 'for' triplo, come for i := iter(); done(i); i = next(i) { … }, contiene sync.Locker, come sync.Mutex. Go 1.22 ho modificato il comportamento di tali cicli creando una nuova variabile per ogni iterazione, copiando i valori dalla precedente iterazione; questa copia non è sicura per i lock. #66387.
GOCACHEPROG
Il binario interno cmd/go e il meccanismo di caching dei test possono ora essere implementati da processi secondari che implementano il protocollo JSON tra lo strumento cmd/go e il processo secondario, chiamato variabile d'ambiente GOCACHEPROG. In precedenza era sotto GOEXPERIMENT. I dettagli del protocollo possono essere visti in documentazione.
Tempo di esecuzione
Diversi miglioramenti delle prestazioni nel runtime hanno ridotto il sovraccarico della CPU del 2-3% in media tra un insieme rappresentativo di benchmark. I risultati possono variare a seconda dell'applicazione. Questi miglioramenti includono una nuova implementazione integrata della mappa basata su Tabelle Svedesi, un'allocazione di memoria più efficiente per piccoli oggetti e una nuova implementazione interna del mutex nel runtime.
La nuova implementazione integrata della mappa e il nuovo mutex interno del runtime possono essere disattivati impostando GOEXPERIMENT=noswissmap e GOEXPERIMENT=nospinbitmutex durante la compilazione, rispettivamente.
Compilatore
Il compilatore ha già vietato la definizione di nuovi metodi con tipi di ricevente generati da cgo, ma era possibile aggirare questa restrizione tramite alias di tipo. Go 1.24 ora restituisce sempre un errore se il ricevente indica un tipo cgo generato, direttamente o indirettamente (tramite un alias di tipo).
Linker
Il linker ora genera un identificatore di build GNU (voci ELF NT_GNU_BUILD_ID) sulle piattaforme ELF e UUID (comando di caricamento Mach-O LC_UUID) su macOS per impostazione predefinita. L'identificatore di build o UUID è estratto dall'identificatore di build di Go. Questo può essere disabilitato con il flag del linker -B none, oppure sovrascritto con il flag del linker -B 0xNNNN con un valore esadecimale specificato dall'utente.
Rolling
Come indicato in note di rilascio di Go 1.22, Go 1.24 ora richiede per il rolling Go 1.22.6 o successivo. Gli sviluppatori prevedono che Go 1.26 richiederà per il rolling un rilascio puntuale di Go 1.24 o successivo.
Libreria Standard
Accesso al file system limitato a directory
Nuovo tipo os.Root fornisce la possibilità di eseguire operazioni sul file system entro una directory specifica.
Funzione os.OpenRoot apre una directory e restituisce os.Root. Metodi su os.Root operano in questa directory e non consentono ai percorsi di riferirsi a posizioni al di fuori della directory, compresi quelli che seguono simbolicamente collegamenti al di fuori della directory. I metodi in os.Root riflettono la maggior parte delle operazioni del file system disponibili nel pacchetto os, inclusi, ad esempio, os.Root.Open, os.Root.Create, os.Root.Mkdir e os.Root.Stat.
Nuova funzione di benchmarking
I benchmark ora possono utilizzare un metodo più veloce e meno soggetto a errori testing.B.Loop per eseguire iterazioni sui benchmark come for b.Loop() { … } invece delle tipiche strutture cicliche che coinvolgono b.N come for range b.N. Ciò offre due vantaggi significativi:
- La funzione di benchmark viene eseguita esattamente una volta per ogni -count, pertanto le costose fasi di impostazione e pulizia vengono eseguite solo una volta.
- I parametri di chiamata della funzione e i risultati continuano a vivere, impedendo al compilatore di ottimizzare completamente il corpo del ciclo.
Finalizzatori migliorati
Nuova funzione runtime.AddCleanup è un meccanismo di completamento che è più flessibile, più efficace e meno soggetto a errori rispetto a runtime.SetFinalizer. AddCleanup collega una funzione di pulizia all'oggetto, che verrà eseguita non appena l'oggetto diventa non disponibile. Tuttavia, a differenza di SetFinalizer, è possibile allegare più funzioni di pulizia a un singolo oggetto, le pulizie possono essere collegate a puntatori interni, di solito non causano perdite di memoria quando gli oggetti formano un ciclo e non ritardano il rilascio dell'oggetto o degli oggetti a cui punta. Nuovo codice dovrebbe preferire AddCleanup a SetFinalizer.
Nuovo pacchetto weak
Nuovo pacchetto weak fornisce puntatori deboli.
I puntatori deboli sono un primitivo a basso livello fornito per creare strutture che utilizzano la memoria in modo efficiente, come i dizionari deboli per mappe di valori, dizionari di canonizzazione per qualsiasi cosa non coperta dal pacchetto unique, e diversi tipi di cache. Per supportare questi casi d'uso, questa versione fornisce anche runtime.AddCleanup e maphash.Comparable.
Nuovo pacchetto crypto/mlkem
Nuovo pacchetto crypto/mlkem implementa ML-KEM-768 e ML-KEM-1024.
ML-KEM è un meccanismo di scambio chiave post-quantistico, precedentemente noto come Kyber e specificato in FIPS 203.
Nuovi pacchetti crypto/hkdf, crypto/pbkdf2 e crypto/sha3
Nuovo pacchetto crypto/hkdf implementa una funzione di derivazione della chiave basata su HMAC 'Extract-and-Expand' HKDF, come definito in RFC 5869.
Nuovo pacchetto crypto/pbkdf2 implementa una funzione di derivazione della chiave basata su password PBKDF2, come definito in RFC 8018.
Nuovo pacchetto crypto/sha3 implementa la funzione hash SHA-3 e le funzioni SHAKE e cSHAKE di output estensibile, come definito in FIPS 202.
Tutti e tre i pacchetti si basano su pacchetti esistenti di golang.org/x/crypto/…
Compliance FIPS 140-3
Questa release include un nuovo set di meccanismi per garantire la compliance FIPS 140-3.
Il modulo crittografico di Go è un insieme di pacchetti interni della libreria standard, che vengono utilizzati in modo trasparente per implementare algoritmi approvati FIPS 140-3. Le applicazioni non richiedono modifiche per utilizzare il modulo crittografico di Go per algoritmi approvati.
Una nuova variabile d'ambiente GOFIPS140 può essere utilizzata per scegliere la versione del modulo crittografico di Go da utilizzare nella build. Nuovo la configurazione GODEBUG fips140 può essere utilizzato per abilitare la modalità FIPS 140-3 durante l'esecuzione.
Go 1.24 include il modulo crittografico di Go versione v1.0.0, attualmente in fase di test con un laboratorio accreditato CMVP.
Nuovo pacchetto sperimentale testing/synctest
Nuovo pacchetto sperimentale testing/synctest fornisce supporto per il test di codice concorrente.
- Funzione synctest.Run esegue un gruppo di goroutine in un «bubble» isolato. Nel bubble, le funzioni del pacchetto ora operano su orologi falsi.
- Le funzioni synctest.Wait attende che tutte le goroutine siano bloccate nel bubble attuale.
Puoi trovare ulteriori dettagli nella documentazione del pacchetto.
Il pacchetto synctest è sperimentale e deve essere abilitato impostando GOEXPERIMENT=synctest. L'API del pacchetto potrebbe cambiare nelle future versioni. #67434 Puoi trovare ulteriori dettagli e fornire feedback.
Modifiche minori nella libreria
archive
Le implementazioni (*Writer.AddFS) in archive/zip e archive/tar ora scrivono l’intestazione della directory per le directory vuote.
bytes
Il pacchetto bytes aggiunge alcune funzioni che lavorano con gli iteratori:
- Lines restituisce un iteratore sulle righe divise da nuove righe in uno slice di byte.
- SplitSeq restituisce un iteratore su tutti i sottoslice dello slice di byte, separati da un delimitatore.
- SplitAfterSeq restituisce un iteratore sui sottoslice dello slice di byte, separati dopo ogni occorrenza del delimitatore.
- FieldsSeq restituisce un iteratore sui sottovettori di uno slice di byte attorno alle sequenze di caratteri di spazio, come definito unicode.IsSpace
- FieldsFuncSeq restituisce un iteratore sui sottovettori di uno slice di byte attorno alle sequenze di punti di codice unicode che soddisfano il predicato.
crypto/aes
Il valore restituito NewChipher non implementa più i metodi NewCTR, NewGCM, NewCBCEncrypter e NewCBCDecrypter. Questi metodi erano non documentati e non erano disponibili su tutte le architetture. Ora il valore Block deve essere passato direttamente alle funzioni corrispondenti crypto/cipher. Attualmente crypto/cipher controlla ancora questi metodi sui valori Block, anche se non sono più supportati dalla libreria standard.
crypto/cipher
Nuova funzione NewGCMWithRandomNonce restituisce AEAD, che implementa AES-GCM, generando un numero casuale monouso durante Seal e aggiungendolo all'inizio del testo crittografato.
Implementazione Stream, restituita NewCTR utilizzando crypto/aes ora è molte volte più veloce su amd64 e arm64.
NewOFB, NewCFBEncrypter e NewCFBDecrypter ora sono considerati obsoleti. Le modalità OFB e CFB non sono autenticate, il che generalmente consente attacchi attivi di manipolare e ripristinare il testo in chiaro. Si raccomanda alle applicazioni di utilizzare AEAD invece. Se è necessaria una modalità non autenticata, è possibile usare Stream in alternativa. NewCTR in cambio.
crypto/ecdsa
PrivateKey.Sign ora genera una firma deterministica secondo RFC 6979, se la sorgente di casualità è nil.
crypto/md5
Il valore restituito md5.New, ora implementa anche l'interfaccia encoding.BinaryAppender.
crypto/rand
Funzione Leggi ora garantisce l'assenza di fallimenti. Se Read incontra un errore durante la lettura Reader, il programma si interromperà senza possibilità di recupero. Si noti che il Reader di default è documentato per funzionare sempre con successo, quindi questa modifica dovrebbe interessare solo i programmi che sovrascrivono la variabile Reader. Un'eccezione sono i kernel Linux precedenti alla versione 3.17, dove il Reader di default apre ancora /dev/urandom e può fallire.
Su Linux 6.11 e versioni successive, Reader ora utilizza la chiamata di sistema getrandom attraverso vDSO. Questo è significativamente più veloce, di solito per letture piccole.
Su OpenBSD, Reader ora utilizza arc4random_buf(3).
Nuova funzione Text ora può generare stringhe di testo casuali crittograficamente sicure.
crypto/rsa
GenerateKey ora restituisce un errore se viene richiesta una chiave lunga meno di 1024 bit. Tutti i metodi Sign, Verify, Encrypt e Decrypt ora restituiscono un errore se utilizzati con una chiave di dimensione inferiore a 1024 bit. Queste chiavi non sono sicure e non dovrebbero essere utilizzate. Impostazione GODEBUG rsa1024min=0 ripristina il vecchio comportamento, ma gli sviluppatori di Go consigliano di farlo solo quando necessario e solo nei test, ad esempio aggiungendo la riga //go:debug rsa1024min=0 nel file di test. Nuovo esempio GenerateKey offre una chiave di test standard di 2024 bit facile da usare.
Ora è sicuro e più efficiente chiamare PrivateKey.Precompute fino a PrivateKey.Validate. Precompute ora è più veloce in presenza di PrecomputedValues, ad esempio quando si estrae una chiave da JSON.
Il pacchetto ora rifiuta più chiavi errate, anche quando Validate non viene chiamato, e GenerateKey ora può restituire nuovi errori per fonti di casualità rotte. I campi Primes e Precomputed della struttura PrivateKey ora sono utilizzati e convalidati anche quando alcuni valori sono assenti. Sono state apportate modifiche a crypto/x509 per l'analisi e l'estrazione delle chiavi RSA, come descritto di seguito.
SignPKCS1v15 e VerifyPKCS1v15 ora supportano SHA-512/224, SHA-512/256 e SHA-3.
GenerateKey ora utilizza un metodo leggermente diverso per generare l'esponente privato (funzione di Carmichael invece della funzione di Eulero). Applicazioni rare che ricreano chiavi solo da numeri primi dall'esterno possono generare risultati diversi ma compatibili.
Le operazioni sulle chiavi pubbliche e private sono ora fino a due volte più veloci su wasm.
crypto/sha*
- crypto/sha1: valore restituito sha1.New ora implementa anche l'interfaccia encoding.BinaryAppender.
- crypto/sha256: valori restituiti sha256.New e sha256.New224 ora implementano anche l'interfaccia encoding.BinaryAppender.
- crypto/sha512: valori restituiti sha512.New, sha512.New384, sha512.New512_224 e sha512.New512_256, ora implementano anche l'interfaccia encoding.BinaryAppender.
crypto/subtle
Nuova funzione WithDataIndependentTiming consente all'utente di eseguire una funzione con funzioni specifiche dell'architettura attivate, garantendo l'invariabilità di determinate istruzioni rispetto al valore temporale dei dati. Questo può essere utilizzato per assicurarsi che il codice, progettato per funzionare in tempo costante, non sia stato ottimizzato da funzionalità a livello di processore in modo tale da operare in tempo variabile. Attualmente, WithDataIndependentTiming utilizza il bit PSTATE.DIT su arm64 e non fa nulla su tutte le altre architetture. Impostazione GODEBUG dataindependenttiming=1 attiva la modalità DIT per l'intero programma Go.
Risultato XORBytes deve sovrapporsi completamente o per niente con l'input. In precedenza, il comportamento era indefinito in caso contrario, mentre ora XORBytes genererà un panico.
crypto/tls
Il server TLS ora supporta Encrypted Client Hello (ECH). Questa funzionalità può essere attivata compilando il campo Config.EncryptedClientHelloKeys.
Un nuovo meccanismo di scambio chiave post-quantistico X25519MLKEM768 è ora supportato ed è attivato per impostazione predefinita quando Config.CurvePreferences è nil. Impostazione GODEBUG tlsmlkem=0 restituisce il valore predefinito.
Il supporto per l'exchange chiave sperimentale X25519Kyber768Draft00 è stato rimosso.
Il processo di scambio della chiave ora viene gestito interamente dal pacchetto crypto/tls. L'ordice Config.CurvePreferences ora viene ignorato, e il contenuto è utilizzato solo per determinare quali scambi di chiavi includere quando il campo è compilato.
Il nuovo campo ClientHelloInfo.Extensions elenca gli identificatori delle estensioni ricevuti nel messaggio Client Hello. Questo può essere utile per il fingerprinting dei client TLS.
crypto/x509
Impostazione GODEBUG x509sha1 è stato rimosso. Certficicate.Verify non supporta più le firme basate su SHA-1.
OID ora implementa le interfacce encoding.BinaryAppender e encoding.TextAppender.
Il campo predefinito delle politiche dei certificati è stato cambiato da Certificate.PolicyIdentifiers con Certificate.Policies. Durante l'analisi dei certificati, entrambi i campi saranno compilati, ma nella creazione delle politiche dei certificati verranno utilizzati i dati dal campo Certificate.Policies invece di Certificate.PolicyIdentifiers. Questa modifica può essere ripristinata con la configurazione GODEBUG x509usepolicies=0.
CreateCertificate ora genererà un numero di serie utilizzando un metodo compatibile con RFC 5280 quando il modello viene passato nel campo Certificate.SerialNumber nil, invece di fallire.
Certificate.Verify ora supporta la validazione delle politiche, come definito in RFC 5280 e RFC 9618. Il nuovo campo VerifyOptions.CertificatePolicies può essere impostato su un insieme accettabile di politiche OID. Solo le catene di certificati con campi di politiche validi verranno restituite da Certificate.Verify.
MarshalPKCS8PrivateKey ora restituisce un errore invece di estrarre una chiave RSA non corretta. (MarshalPKCS1PrivateKey non restituisce un errore e il suo comportamento con chiavi non corrette fornite rimane indefinito.)
ParsePKCS1PrivateKey e ParsePKCS8PrivateKey ora utilizzano e convalidano i valori codificati CRT, quindi possono rifiutare chiavi RSA non valide che erano state precedentemente accettate. L'uso di impostazione GODEBUG x509rsacrt=0 riporta al ricalcolo dei valori CRT.
debug/elf
Il pacchetto debug/elf aggiunge supporto per l'elaborazione delle versioni dei simboli nei file ELF (Executable and Linkable Format). Nuovo metodo File.DynamicVersions restituisce un elenco delle versioni dinamiche definite nel file ELF. Nuovo metodo File.DynamicVersionNeeds restituisce un elenco delle versioni dinamiche richieste da questo file ELF, definite in altri oggetti ELF. Infine, i nuovi campi Symbol.HasVersion e Symbol.VersionIndex indicano la versione del simbolo.
encoding
Due nuove interfacce TextAppender e BinaryAppender sono stati introdotti per aggiungere una rappresentazione testuale o binaria di un oggetto a uno slice di byte. Questi interfacciano offrono le stesse funzionalità di TextMarshaler e BinaryMarshaler, ma invece di allocare un nuovo slice ogni volta, aggiungono i dati direttamente nello slice esistente. Queste interfacce sono attualmente implementate da tipi della libreria standard che già implementano TextMarshaler e/o BinaryMarshaler.
encoding/json
Durante la costruzione, il campo della struttura con la nuova opzione omitzero nel tag del campo sarà omesso se il suo valore è zero. Se il tipo del campo ha un metodo IsZero() bool, sarà utilizzato per determinare se il valore è nullo. Altrimenti, il valore sarà nullo se è il valore nullo per il suo tipo. Il tag del campo omitzero è più pulito e meno soggetto a errori rispetto a omitempty, quando l'intenzione è di omettere valori nulli. In particolare, a differenza di omitempty, omitzero omette valori nulli time.Time , che è una fonte comune di problemi.
Se sia omitempty che omitzero sono specificati, il campo sarà omesso se il valore è vuoto o nullo (o entrambi contemporaneamente).
UnmarshalTypeError.Field ora include strutture incorporate per fornire messaggi di errore più dettagliati.
go/types
Tutte le strutture dati go/types, che rivelano sequenze di coppie di metodi come Len() int e At(int) T, ora hanno anche metodi che restituiscono iteratori, semplificando il codice come questo:
params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }
Per questo:
for param := range fn.Signature().Params().Variables() { use(param) }
Metodi: Interface.EmbeddedTypes Interface.ExplicitMethods Interface.Methods MethodSet.Methods Named.Methods Scope.Children Struct.Fields Tuple.Variables TypeList.Types TypeParamList.TypeParams Union.Terms
hash/*
- hash/adler32: valore restituito Nuovo, ora implementa anche l'interfaccia encoding.BinaryAppender
- hash/crc32: valori restituiti Nuovo e NewIEEE, ora implementano anche l'interfaccia encoding.BinaryAppender
- hash/crc64: valore restituito Nuovo, ora implementa anche l'interfaccia encoding.BinaryAppender
- hash/fnv: valori restituiti New32 New32a New64 New64a New128 e New128a, ora implementano anche l'interfaccia encoding.BinaryAppender
- hash/maphash: nuove funzioni Comparabile e WriteComparable possono calcolare l'hash di qualsiasi valore che può essere confrontato. Questo consente di hasciare qualsiasi cosa che possa essere usata come chiave in un dizionario Go.
log/slog
Nuovo DiscardHandler è un gestore che non è mai attivo e scarta sempre il suo output.
Livello e LevelVar ora implementa l'interfaccia encoding.TextAppender.
math/*
- math/big: Float, Int e Rat ora implementa l'interfaccia encoding.TextAppender.
- math/rand: le chiamate a funzioni di alto livello deprecate Seed non hanno più alcun effetto. Per ripristinare il comportamento precedente, è possibile utilizzare l'impostazione GODEBUG randseednop=0. Maggiore contesto in proposta 67273.
- math/rand/v2: ChaCha8 e PCG ora implementa l'interfaccia encoding.BinaryAppender.
net
ListenCondig ora utilizza MPTCP per impostazione predefinita nei sistemi che lo supportano (attualmente solo Linux).
IP ora implementa l'interfaccia encoding.TextAppender.
net/http
è cambiato il limite Transport sulle risposte informative 1xx in risposta a una richiesta. In precedenza questo fermava la richiesta e restituiva un errore dopo aver ricevuto più di 5 risposte 1xx. Ora restituisce un errore solo se la dimensione totale di tutte le risposte 1xx supera la configurazione. Transport.MaxResponseHeaderBytes.
Inoltre, quando una richiesta ha un hook per il monitoraggio net/http/httptrace.ClientTrace.Got1xxResponse, ora non c'è limite al numero totale di risposte 1xx. L'hook Got1xxResponse può restituire un errore per interrompere la richiesta.
Transport e Server ora hanno un campo HTTP2 che consente la configurazione delle impostazioni del protocollo HTTP/2.
I nuovi campi Server.Protocols e Transport.Protocols forniscono un modo semplice per configurare quali protocolli il server o il client utilizzano.
Il server e il client possono essere configurati per supportare connessioni HTTP/2 non crittografate.
Quando Server.Protocols contiene UnencrypterHTTP2, il server accetterà connessioni HTTP/2 su porte non crittografate. Il server può accettare sia HTTP/1 che HTTP/2 non crittografato sulla stessa porta.
Quando Transport.Protocols contiene UnencryptedHTTP2 e non contiene HTTP1, il trasporto utilizzerà HTTP/2 non crittografato per gli indirizzi http://. Se il trasporto è configurato per utilizzare sia HTTP/1 che HTTP/2 non crittografato, utilizzerà HTTP/1.
Il supporto per HTTP/2 non crittografato utilizza "HTTP/2 con conoscenza anticipata" (RFC 9113, sezione 3.3). L'intestazione obsoleta "Upgrade: h2c" non è supportata.
net/netip
Addr, AddrPort e Prefix ora implementano le interfacce encoding.BinaryAppender e encoding.TextAppender.
net/url
URL ora implementa anche l'interfaccia encoding.BinaryAppender.
os/user
In Windows Current può ora essere utilizzato in Windows Nano Server. L'implementazione è stata aggiornata per evitare l'uso di funzioni dalla libreria NetApi32, che è assente in Nano Server.
In Windows Current, Lookup e LookupId ora supportano i seguenti account di servizio utente incorporati:
- NT AUTHORITYSYSTEM
- NT AUTHORITYLOCAL SERVICE
- NT AUTHORITYNETWORK SERVICE
In Windows Current è stato notevolmente accelerato quando l'utente corrente è collegato a un dominio lento, il che è comune per molti utenti aziendali. La nuova prestazione dell'implementazione ora è nell'ordine dei millisecondi, rispetto all'implementazione precedente, che poteva richiedere diversi secondi, persino minuti, per completarsi.
In Windows Current ora restituisce l'utente proprietario del processo quando il thread corrente si finge un altro utente. In precedenza, questo restituiva un errore.
regexp
Regexp ora implementa l'interfaccia encoding.TextAdapter.
runtime
Funzione GOROOT ora dichiarato obsoleto. Nella nuova versione, si consiglia di utilizzare il percorso di sistema per determinare il binario 'go' e usare 'go env GOROOT' per determinare GOROOT.
strings
Il pacchetto strings aggiunge diverse funzioni per lavorare con gli iteratori:
- Lines restituisce un iteratore per le righe della stringa separate da una nuova linea.
- SplitSeq restituisce un iteratore per tutte le sottostringhe della stringa, separate dal delimitatore.
- SplitAfterSeq restituisce un iteratore per le sottostringhe della stringa, separate dopo ogni occorrenza del delimitatore.
- FieldsSeq restituisce un iteratore per le sottostringhe della stringa attorno a sequenze di caratteri di spazio, come definito.unicode.IsSpace
- FieldsFuncSeq restituisce un iteratore per le sottostringhe della stringa attorno a sequenze di punti di codice Unicode che soddisfano il predicato.
sync
Implementazione sync.Map è stata modificata per migliorare le prestazioni, in particolare per le modifiche al dizionario. Ad esempio, è meno probabile che ci sia una competizione tra modifiche di insiemi non sovrapposti su grandi dizionari, e non è più necessario il tempo di accumulo per raggiungere il caricamento dal dizionario con bassa competizione.
Se riscontri problemi, imposta GOEXPERIMENT=nosynchashtriemap durante la compilazione per tornare alla vecchia implementazione e, per favore, compila il modulo per segnalare il problema.
testing
Nuovi metodi T.Context e B.Context restituiscono il contesto che viene annullato dopo il completamento del test e prima dell'esecuzione delle funzioni di pulizia del test.
Nuovi metodi T.Chdir e B.Chdir possono essere utilizzati per cambiare la directory di lavoro durante l'esecuzione del test o del benchmark.
text/template
I template ora supportano range-over-func e range-over-int.
ora
Tempo ora implementa le interfacce encoding.BinaryAppender e encoding.TextAppender.
Porte
Linux
Come era annunciato nelle note di rilascio di Go 1.23, Go 1.24 richiede il kernel Linux versione 3.2 o successiva.
Darwin
Go 1.24 è l'ultima versione che funzionerà su macOS 11 Big Sur. Go 1.25 richiederà macOS 12 Monterey o successivo.
WebAssembly
La direttiva del compilatore go:wasmexport è stata aggiunta ai programmi Go per esportare funzioni nell'host WebAssembly.
Nell'interfaccia di sistema WebAssembly Preview 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 supporta la compilazione di un programma Go come reactor/library attraverso l'indicazione del flag di compilazione -buildmode=c-shared.
Ora sono consentiti più tipi come tipo di argomento o risultato per le funzioni go:wasmimport. In particolare, bool, string, uintptr e puntatori a determinati tipi sono consentiti (ulteriori dettagli possono essere trovati in documentazione), insieme a tipi di interi a 32 bit e 64 bit e a numeri a virgola mobile, e unsafe.Pointer, che sono già consentiti. Questi tipi sono anch'essi consentiti come tipi di argomento o risultato per le funzioni go:wasmexport.
I file di supporto per WebAssembly sono stati spostati in lib/wasm da misc/wasm.
La dimensione della memoria originale è stata notevolmente ridotta, specialmente per le piccole applicazioni WebAssembly.
Windows
La porta a 32 bit per windows/arm (GOOS=windows GOARCH=arm) è stata segnalata come rotta. Ulteriori dettagli in #70705
Fonte: linux.org.ru
