Go 1.24

Go 1.24

Nuova edizione del linguaggio Go, versione 1.24, dopo sei mesi da Go 1.23. La maggior parte delle modifiche riguardano l'implementazione della toolchain, del runtime e delle librerie. Come sempre, il rilascio garantisce la promessa di compatibilità per Go 1. Gli sviluppatori del linguaggio si aspettano che quasi tutti i programmi Go continuino a compilarsi e funzionare come prima.

Modifiche al linguaggio

Go 1.24 ora supporta completamente gli alias generici di tipo: un alias di tipo può essere parametrizzato come un tipo dichiarato. Maggiori dettagli nella specifica del linguaggio. Tuttavia, questa possibilità può essere disabilitata impostando GOEXPERIMENT=noaliastypeparams; tuttavia, l'opzione aliastypeparams sarà rimossa in Go 1.25.

Strumenti

Il comando go

I moduli go ora possono monitorare le dipendenze eseguibili utilizzando la direttiva tool in go.mod. Questo elimina la necessità della precedente soluzione di lavoro che prevedeva di aggiungere strumenti come importazioni vuote nel file, solitamente 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 porta all'aggiunta della direttiva dello strumento nel modulo attuale per i pacchetti specificati, oltre ad aggiungere direttive di dipendenza.

Nuovo meta-pattern tool fa riferimento a tutti gli strumenti nel modulo attuale. Questo può essere utilizzato per aggiornarli tutti tramite go get tool o per installarli nella 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 a un cache maggiore. #69290.

I comandi go build e go install ora accettano il flag -json, che restituisce output e errori di compilazione come output strutturato JSON in standard output. I dettagli del formato possono essere trovati in go help buildjson.

Inoltre, go test -json ora riporta output e errori di compilazione in JSON, mescolati con il JSON del risultato del test. Possono essere distinti per i nuovi tipi di action, ma se causano problemi nel sistema di integrazione dei test, è possibile tornare all'output testuale della build tramite la configurazione GODEBUG gotestjsonbuildtext=1.

La nuova variabile d'ambiente GOAUTH fornisce un modo flessibile per autorizzare il download privato dei moduli. Maggiori dettagli possono essere trovati in go help goauth.

Il comando go build ora imposta la versione del modulo principale nel binario compilato, basandosi sul tag e/o sul commit del sistema di controllo versione. Il suffisso +dirty verrà aggiunto in caso di modifiche non committate. Si può utilizzare il flag -buildvcs=false per escludere le informazioni di controllo versione dal binario.

Nuova configurazione GODEBUG toolchaintrace=1 ora può essere utilizzata per monitorare il processo di selezione della toolchain nel comando go.

Cgo

Cgo supporta nuove annotazioni per le funzioni C per migliorare le prestazioni in fase di esecuzione. #cgo noescape cFunctionName dice al compilatore che la memoria passata alla funzione C cFunctionName non va persa. #cgo nocallback cFunctionName dice al compilatore che la funzione C cFunctionName non richiama alcuna funzione Go. Maggiori informazioni possono essere trovate nella documentazione cgo.

Cgo al momento rifiuta chiamate compilate a funzioni C che hanno dichiarazioni incompatibili. Ad esempio, se f è dichiarata come sia void f(int) che void f(double), cgo riporterà un errore invece di generare una sequenza di chiamate errata per f(0). Una novità in questa versione è il miglioramento della rilevazione di questa condizione di errore quando dichiarazioni incompatibili appaiono in file diversi. #67699.

Objdump

Lo strumento objdump ora supporta la disassemblazione su LoongArch a 64 bit (GOARCH=loong64), RISC-V (GOARCH=riscv64) e S390X (GOARCH=s390x).

Vet

Il nuovo analizzatore tests segnala errori comuni nelle dichiarazioni di test, fuzzers, benchmark e esempi nei pacchetti di test, come nomi malformati, firme errate o esempi che documentano identificatori inesistenti. Alcuni di questi errori possono causare il fallimento dei test.

L'attuale analizzatore printf ora segnala diagnosi di chiamate nella forma fmt.Printf(s), dove s è una stringa di formato non costante, senza altri argomenti. Queste chiamate sono quasi sempre un errore, poiché il valore di s può contenere il simbolo %; usa invece fmt.Print. 60529. Questo controllo tende a fare rilevamenti nel codice esistente, e quindi viene applicato solo quando la versione del linguaggio (come specificato dalla direttiva go del file go.mod o dai commenti `//go:build) è almeno Go 1.24, per evitare di causare guasti all'integrazione continua durante l'aggiornamento alla toolchain Go 1.24.

L'analizzatore buildtag esistente ora riporta diagnostiche quando c'è un errore di restrizione della versione di build precedente Go nella direttiva //go:build. Ad esempio, //go:build go1.23.1 si riferisce a un release patch; invece usa //go:build go1.23. #64127.

L'analizzatore copylock esistente ora riporta diagnostiche quando una variabile, dichiarata in un ciclo 'for' triplo, come for i := iter(); done(i); i = next(i) { ... }, contiene un sync.Locker, come sync.Mutex. Go 1.22 ha cambiato il comportamento di tali cicli per creare una nuova variabile per ogni iterazione, copiando i valori dalla iterazione precedente; 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 in processi secondari, implementando un protocollo JSON tra lo strumento cmd/go e il processo secondario nominato dalla variabile d'ambiente GOCACHEPROG. In precedenza era per GOEXPERIMENT. I dettagli del protocollo possono essere visti in documentazione.

Tempo di esecuzione

Diverse migliorie nelle prestazioni a runtime hanno ridotto le spese per la CPU del 2-3% in media su un set di benchmark rappresentativi. I risultati possono variare a seconda dell'applicazione. Queste migliorìe includono una nuova implementazione incorporata di map basata su Tabelle Svedesi, allocazione di memoria più efficiente per piccoli oggetti e una nuova implementazione interna del mutex a runtime.

La nuova implementazione di map incorporata e il nuovo mutex interno a runtime possono essere disabilitati con le impostazioni GOEXPERIMENT=noswissmap e GOEXPERIMENT=nospinbitmutex durante la build, rispettivamente.

Compilatore

Il compilatore ha già vietato la definizione di nuovi metodi con tipi di ricevitori generati da cgo, ma era possibile aggirare questa restrizione attraverso un alias di tipo. Go 1.24 ora genera sempre un errore se il ricevitore denota un tipo cgo generato, direttamente o indirettamente (attraverso un alias di tipo).

Linker

Il linker ora genera un identificativo di build GNU (record ELF NT_GNU_BUILD_ID) sulle piattaforme ELF e UUID (comando di caricamento Mach-O LC_UUID) su macOS per impostazione predefinita. L'identificativo di build o UUID viene derivato dall'identificativo di build di Go. Questo può essere disattivato con il flag del linker -B none, oppure sovrascritto con il flag del linker -B 0xNNNN con un valore esadecimale fornito dall'utente.

Rollout

Come indicato in note di rilascio di Go 1.22, Go 1.24 ora richiede Go 1.22.6 o versione successiva per l'avvio. Gli sviluppatori si aspettano che Go 1.26 richiederà un rilascio patch di Go 1.24 o superiore per l'avvio.

Libreria standard

Accesso al file system limitato dalla directory

Nuovo tipo os.Root consente di eseguire operazioni sul file system all'interno di una directory specifica.

La funzione os.OpenRoot apre una directory e restituisce os.Root. I metodi su os.Root operano in questa directory e non consentono ai percorsi di fare riferimento a posizioni al di fuori della directory, comprese quelle che seguono collegamenti simbolici al di fuori della directory. I metodi su 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 benchmark

I benchmark possono ora utilizzare un metodo più veloce e meno soggetto a errori testing.B.Loop per eseguire iterazioni del benchmark come for b.Loop() { … } invece delle tipiche strutture cicliche che coinvolgono b.N come for range b.N. Questo offre due vantaggi significativi:

  • La funzione di benchmark viene eseguita esattamente una volta per ogni -count, pertanto le costose fasi di setup e cleanup vengono eseguite solo una volta.
  • I parametri della funzione e i risultati rimangono vivi, impedendo al compilatore di ottimizzare completamente il corpo del ciclo.

Finalizzatori migliorati

La nuova funzione runtime.AddCleanup è un meccanismo di pulizia che è più flessibile, più efficace e meno soggetto a errori rispetto a runtime.SetFinalizer. AddCleanup associa una funzione di pulizia a un oggetto, che verrà eseguita non appena l'oggetto diventa non accessibile. Tuttavia, a differenza di SetFinalizer, è possibile associare più funzioni di pulizia a un singolo oggetto, le pulizie possono essere associate a puntatori interni, le pulizie generalmente non inducono perdite quando gli oggetti formano un ciclo e le pulizie non ritardano il rilascio dell'oggetto o degli oggetti a cui si riferisce. Il codice nuovo 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 in modo efficace la memoria, come dizionari deboli per mappare valori, dizionari di canonizzazione per tutto ciò che non è coperto dal pacchetto unique, e vari tipi di cache. Per supportare questi casi d'uso, questa release offre anche runtime.AddCleanup e maphash.Comparabile.

Nuovo pacchetto crypto/mlkem

Nuovo pacchetto crypto/mlkem implementa ML-KEM-768 e ML-KEM-1024.

ML-KEM è un meccanismo di scambio di chiavi 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 la funzione di derivazione della chiave basata su HMAC “Extract-and-Expand” HKDF, come definito in RFC 5869.

Nuovo pacchetto crypto/pbkdf2 implementa la 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 SHAKE e la funzione cSHAKE di output estensibile, come definito in FIPS 202.

Tutti e tre i pacchetti sono basati su pacchetti esistenti in golang.org/x/crypto/…

Conformità FIPS 140-3

Questa release include un nuovo insieme di meccanismi per garantire la conformità a FIPS 140-3.

Il modulo crittografico Go è un insieme di pacchetti interni della libreria standard che vengono utilizzati trasparentemente per implementare gli algoritmi approvati FIPS 140-3. Le applicazioni non richiedono modifiche per utilizzare il modulo crittografico Go per gli algoritmi approvati.

La nuova variabile d'ambiente GOFIPS140 può essere utilizzata per scegliere la versione del modulo crittografico Go da utilizzare nella compilazione. La nuova configurazione GODEBUG fips140 può essere utilizzata per abilitare la modalità FIPS 140-3 durante l'esecuzione.

Go 1.24 include il modulo crittografico Go versione v1.0.0, che attualmente è in fase di test con un laboratorio CMVP accreditato.

Nuovo pacchetto sperimentale testing/synctest

Nuovo pacchetto sperimentale testing/synctest fornisce supporto per il test del codice concorrente.

  • La funzione synctest.Run esegue un gruppo di goroutine in un «bubble» isolato. Nella bubble, le funzioni del pacchetto time operano su orologi fittizi.
  • Funzioni synctest.Wait aspetta che tutte le goroutine si blocchino nella bubble corrente.

I dettagli possono essere trovati nella documentazione del pacchetto.

Il pacchetto synctest è sperimentale e deve essere abilitato impostando GOEXPERIMENT=synctest. L'API del pacchetto potrebbe cambiare nelle future release. In #67434 si possono 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 una directory vuota.

bytes

Pacchetto bytes aggiunge diverse funzioni che lavorano con gli iteratori:

  • Lines restituisce un iteratore su righe separate da nuove righe in uno slice di byte.
  • SplitSeq restituisce un iteratore su tutti i sottoslici di uno slice di byte, separato da un delimitatore.
  • SplitAfterSeq restituisce un iteratore sui sottoslici di uno slice di byte, separato dopo ogni occorrenza del delimitatore.
  • FieldsSeq restituisce un iteratore sui sottoslici di uno slice di byte attorno a sequenze di spazi, come definito unicode.IsSpace
  • FieldsFuncSeq restituisce un iteratore sui sottoslici di uno slice di byte attorno a sequenze di punti di codice Unicode che soddisfano un predicato.

crypto/aes

Il valore restituito NewChipher non implementa più i metodi NewCTR, NewGCM, NewCBCEncrypter e NewCBCDecrypter. Questi metodi non erano documentati e non erano disponibili su tutte le architetture. Ora il valore Block deve essere passato direttamente alle funzioni corrispondenti crypto/cipher. Fino ad ora, crypto/cipher controlla ancora questi metodi per i valori Block, anche se non sono più supportati dalla libreria standard.

crypto/cipher

La nuova funzione NewGCMWithRandomNonce false, se l'elemento da sostituire è AEAD, che implementa AES-GCM, generando un numero casuale monouso durante Seal e aggiungendolo all'inizio del testo crittografato.

Implementazione Stream, restituito NewCTR quando utilizzato con crypto/aes è ora molto più veloce su amd64 e arm64.

NewOFB, NewCFBEncrypter e NewCFBDecrypter sono ora dichiarati obsoleti. I modi OFB e CFB non sono autenticati, il che consente in generale attacchi attivi per manipolare e recuperare il testo in chiaro. Si raccomanda alle applicazioni di utilizzare AEAD invece. Se è necessario un modo non autenticato, si può usare Stream invece. NewCTR crypto/ecdsa

PrivateKey.Sign

ora genera una firma deterministica in conformità con RFC 6979 , se la sorgente di casualità è nil.crypto/md5

md5.New

Il valore restituito , implementa ora anche l'interfacciaencoding.BinaryAppender crypto/rand.

Read

La funzione ora garantisce l'assenza di fallimenti. Se Read incontra un errore durante la lettura Reader , il programma termina in modo irreversibile. Si noti che il Reader predefinito è documentato per funzionare sempre con successo, quindi questa modifica dovrebbe riguardare solo i programmi che sovrascrivono la variabile Reader. Un'eccezione sono i kernel Linux prima della versione 3.17, dove il Reader predefinito apre ancora /dev/urandom e può fallire.Su Linux 6.11 e versioni successive, Reader ora utilizza la chiamata di sistema getrandom tramite vDSO. Questo è molto più veloce, in generale per letture piccole.

Su OpenBSD Reader ora utilizza arc4random_buf(3).

Text

La nuova funzione Testo ora può generare stringhe di testo casuali crittograficamente sicure.

crypto/rsa

GenerateKey ora restituisce un errore se viene richiesta una chiave di lunghezza inferiore ai 1024 bit. Tutti i metodi Sign, Verify, Encrypt e Decrypt ora restituiscono un errore se utilizzati con una chiave di dimensioni inferiori a 1024 bit. Tali chiavi non sono sicure e non devono essere utilizzate. Configurazione GODEBUG rsa1024min=0 ripristina il comportamento precedente, ma gli sviluppatori di Go raccomandano di farlo solo se necessario e solo nei test, ad esempio aggiungendo la stringa //go:debug rsa1024min=0 nel file di test. Nuovo un 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 può ora restituire nuovi errori per fonti di casualità difettose. I campi Primes e Precomputed struttura PrivateKey ora sono utilizzati e convalidati anche quando alcuni valori sono assenti. Sono state apportate anche modifiche a crypto/x509 per l'analisi e l'estrazione delle chiavi RSA, descritte 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 Euler). Le applicazioni rare che ricreano chiavi solo da numeri primi possono generare risultati diversi ma compatibili.

Le operazioni su chiavi pubbliche e private ora sono fino a due volte più veloci su wasm.

crypto/sha*

crypto/subtle

La nuova funzione WithDataIndependentTiming permette all'utente di eseguire una funzione con funzionalità specifiche per l'architettura che garantiscono l'immutabilità di certe istruzioni riguardo al tempo dei valori dei dati. Questo può essere utilizzato per assicurarsi che il codice creato per funzionare in tempo costante non sia stato ottimizzato dalle funzionalità a livello di processore in modo da funzionare in tempo variabile. Al momento, WithDataIndependentTiming utilizza il bit PSTATE.DIT su arm64 e non fa nulla su tutte le altre architetture. Configurazione GODEBUG dataindependenttiming=1 abilita la modalità DIT per l'intero programma Go.

Conclusione XORBytes deve sovrapporsi completamente o per nulla all'input. Il comportamento precedente era indefinito in caso contrario, mentre ora XORBytes genererà un panico.

crypto/tls

Il server TLS ora supporta l'Encrypted Client Hello (ECH). Questa funzionalità può essere attivata riempiendo il campo Config.EncryptedClientHelloKeys.

Il nuovo meccanismo post-quantum di scambio delle chiavi X25519MLKEM768 è ora supportato e abilitato di default quando Config.CurvePreferences è nil. Configurazione GODEBUG tlsmlkem=0 restituisce il valore predefinito.

Il supporto per lo scambio di chiavi sperimentale X25519Kyber768Draft00 è stato rimosso.

L'ordine di scambio delle chiavi è ora gestito completamente dal pacchetto crypto/tls. L'ordine Config.CurvePreferences viene ora ignorato, e il contenuto è utilizzato solo per determinare quali scambi di chiavi includere quando il campo è riempito.

Nuovo campo ClientHelloInfo.Extensions elenca un insieme di identificatori di estensioni ricevuti nel messaggio Client Hello. Questo può essere utile per l'fingerprinting dei client TLS.

crypto/x509

Configurazione GODEBUG x509sha1 è stato rimosso. Certficicate.Verify non supporta più le firme basate su SHA-1.

OID ora implementa le interfacce crypto/rand e encoding.TextAppender.

Il campo predefinito delle politiche di certificato è stato modificato da Certificate.PolicyIdentifiers in Certificate.Policies. Durante l'analisi dei certificati entrambi i campi saranno riempiti, ma durante la creazione delle politiche di certificato saranno presi dal campo Certificate.Policies invece di Certificate.PolicyIdentifiers. Questo cambiamento può essere ripristinato con l'impostazione GODEBUG x509usepolicies=0.

CreateCertificate ora genererà un numero di serie utilizzando un metodo compatibile con RFC 5280 durante il passaggio del modello tramite il 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 OIDs. Solo le catene di certificati con grafi di policy validi saranno restituite da Certificate.Verify.

MarshalPKCS8PrivateKey ora restituisce un errore invece di estrarre una chiave RSA errata. (MarshalPKCS1PrivateKey non restituisce un errore e il suo comportamento con chiavi errate fornite rimane indefinito.)

ParsePKCS1PrivateKey e ParsePKCS8PrivateKey ora utilizza e convalida i valori CRT codificati, quindi può rifiutare le chiavi RSA non valide che erano state precedentemente accettate. Utilizzando l'impostazione GODEBUG x509rsacrt=0 riporta al ricalcolo dei valori CRT.

debug/elf

Pacchetto debug/elf aggiunge il supporto per gestire le versioni dei simboli nei file ELF (Executable and Linkable Format). Il nuovo metodo File.DynamicVersions restituisce un elenco delle versioni dinamiche definite nel file ELF. Il nuovo metodo File.DynamicVersionNeeds restituisce un elenco delle versioni dinamiche richieste da questo file ELF, che sono definite in altri oggetti ELF. Infine, i nuovi campi Symbol.HasVersion e Symbol.VersionIndex indicando la versione del simbolo.

encoding

Due nuove interfacce TextAppender e BinaryAppender sono state introdotte per aggiungere una rappresentazione testuale o binaria dell'oggetto a uno slice di byte. Queste interfacce forniscono la stessa funzionalità di TextMarshaler e BinaryMarshaler, ma invece di allocare un nuovo slice ogni volta, aggiungono i dati direttamente nello slice esistente. Queste interfacce sono ora implementate dai tipi della libreria standard che implementano già TextMarshaler e/o BinaryMarshaler.

encoding/json

Nella costruzione, il campo della struttura con la nuova opzione omitzero nel tag del campo della struttura sarà omesso se il suo valore è zero. Se il tipo del campo ha un metodo IsZero() bool, verrà utilizzato per determinare se il valore è nullo. Altrimenti, il valore sarà nullo se è un valore nullo per il suo tipo. Il tag del campo omitzero è più pulito e meno soggetto a errori rispetto a omitempty, quando l'intento è quello di omettere i valori nulli. In particolare, a differenza di omitempty, omitzero omette i nulli time.Time valori, che sono una fonte comune di problemi.

Se sono specificati entrambi omitempty e omitzero, 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, consentendo di semplificare 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/*

log/slog

Nuovo DiscardHandler è un handler che non è mai abilitato e scarta sempre il suo output.

Livello e LevelVar ora implementa l'interfaccia encoding.TextAppender.

math/*

net

ListenCondig ora utilizza MPTCP di default sui sistemi dove è supportato (al momento solo Linux).

IP ora implementa l'interfaccia encoding.TextAppender.

net/http

È cambiato il limite Transport sulle risposte informative ricevute 1xx in risposta a una richiesta. In precedenza, ciò interrompeva 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 la richiesta ha un hook per il tracciamento net/http/httptrace.ClientTrace.Got1xxResponse, ora non c'è limite sul numero totale di risposte 1xx. L'hook Got1xxResponse può restituire un errore per fermare la richiesta.

Transport e Server ora hanno un campo HTTP2 che consente la configurazione delle impostazioni del protocollo HTTP/2.

Nuovi campi Server.Protocols e Transport.Protocols forniscono un modo semplice per configurare quali protocolli il server o il client HTTP 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 criptato, verrà utilizzato HTTP/1.

Il supporto per HTTP/2 non criptato 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 interfacce crypto/rand e encoding.TextAppender.

net/url

URL ora implementa anche l'interfaccia crypto/rand.

os/user

In Windows Corrente ora può essere utilizzato nel Windows Nano Server. L'implementazione è stata aggiornata per evitare l'uso di funzioni dalla libreria NetApi32, che è assente nel Nano Server.

In Windows Corrente, Lookup e LookupId ora supportano i seguenti account di servizio incorporati:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

In Windows Corrente è stata notevolmente accelerata quando l'utente attuale è 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 impiegare alcuni secondi, anche minuti, per completarsi.

In Windows Corrente ora restituisce l'utente proprietario del processo quando il thread corrente rivendica di essere un altro utente. In precedenza restituiva un errore.

regexp

Regexp ora implementa l'interfaccia encoding.TextAdapter.

runtime

La funzione GOROOT ora dichiarata obsoleta. Nel nuovo codice si dovrebbe preferire l'uso del percorso di sistema per determinare il binario "go", e usare go env GOROOT per determinare GOROOT.

strings

Pacchetto strings aggiunge diverse funzioni per lavorare con gli iteratori:

  • Lines restituisce un iteratore per le righe separate da nuove linee nella stringa.
  • 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 spazi bianchi, come definitounicode.IsSpace
  • FieldsFuncSeq restituisce un iteratore per le sottostringhe della stringa attorno a sequenze di punti di codice Unicode che soddisfano un predicato.

sync

Implementazione sync.Map è stata modificata, migliorando le prestazioni, in particolare per le modifiche al dizionario. Ad esempio, è meno probabile che ci sia competizione tra cambiamenti in insiemi non sovrapposti su grandi dizionari, e non è più necessario il tempo di crescita per raggiungere un dizionario con bassa competizione.

Se incontri eventuali problemi, imposta GOEXPERIMENT=nosynchashtriemap durante la compilazione per tornare alla vecchia implementazione e, per favore, compila il modulo di segnalazione problemi.

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 modificare la directory di lavoro durante l'esecuzione del test o del benchmark.

text/template

I modelli ora supportano range-over-func e range-over-int.

time

Tempo ora implementa le interfacce crypto/rand e encoding.TextAppender.

Porte

Linux

Come riportato annunciato nelle note di rilascio di Go 1.23, Go 1.24 richiede un 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 indicando il flag di compilazione -buildmode=c-shared.

Più tipi ora sono consentiti come tipi di argomenti o risultati per le funzioni go:wasmimport. In particolare, bool, string, uintptr e puntatori a tipi specifici sono consentiti (i dettagli possono essere visualizzati in documentazione), insieme a tipi interi a 32 bit e 64 bit e con numeri a virgola mobile, e unsafe.Pointer, che sono già consentiti. Questi tipi sono anche consentiti come tipi di argomenti o risultati per le funzioni go:wasmexport.

I file di supporto per WebAssembly sono stati spostati in lib/wasm da misc/wasm.

La dimensione di memoria di base è stata notevolmente ridotta, soprattutto per le piccole applicazioni WebAssembly.

Windows

Il port a 32 bit windows/arm (GOOS=windows GOARCH=arm) è stato segnalato come rotto. Maggiori dettagli in #70705

Fonte: linux.org.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster