Nová verze programovacího jazyka Go, verze 1.24, vychází šest měsíců po Go 1.23. Většina změn se týká implementace toolchainu, runtime a knihoven. Jak je obvyklé, vydání zajišťuje slib kompatibility Go 1. Vývojáři jazyka očekávají, že téměř všechny programy v Go budou nadále kompilovatelné a budou fungovat jako dřív.
Změny v jazyce
Go 1.24 nyní plně podporuje generické typové aliasy: alias typu může být parametrizován jako deklarovaný typ. Podrobnosti naleznete v specifikaci jazyka. Zatím lze tuto možnost deaktivovat nastavením GOEXPERIMENT=noaliastypeparams; nicméně volba aliastypeparams bude odstraněna v Go 1.25.
Nástroje
Příkaz go
Moduly Go nyní mohou sledovat vykonatelné závislosti pomocí direktivy tool v go.mod. Tímto se eliminuje potřeba předchozího obchodu s přidáváním nástrojů jako prázdných importů do souboru, obvykle nazývaného "tools.go". Příkaz go tool nyní může spouštět tyto nástroje vedle nástrojů dodávaných spolu s Go. Více informací naleznete v dokumentaci.
Nová vlajka -tool pro go get vede k přidání direktivy nástroje do aktuálního modulu pro specifikované balíčky navíc k přidání požadovaných direktiv.
Nový meta-vzor tool odkazuje na všechny nástroje v aktuálním modulu. To může být použito k jejich hromadné aktualizaci přes go get tool nebo k jejich instalaci do adresáře GOBIN přes go install tool.
Spuštěné soubory vytvořené pomocí go run a nové chování go tool jsou nyní ukládány do cache Go. To zrychluje opakované spouštění díky zvětšené cache. #69290.
Příkazy go build a go install nyní akceptují vlajku -json, která hlásí výstupy a chyby kompilace jako strukturovaný výstup JSON do standardního výstupu. Podrobnosti formátu naleznete v go help buildjson.
Navíc, go test -json nyní hlásí výstupy a chyby kompilace v JSON, smíchané s JSONem výsledků testu. Tyto lze odlišit podle nových typů Action, ale pokud způsobují problémy v testovací integrační systém, lze se vrátit k textovému výstupu kompilace prostřednictvím nastavení GODEBUG gotestjsonbuildtext=1.
Nová proměnná prostředí GOAUTH poskytuje flexibilní způsob autorizace soukromých modulových stahování. Podrobnosti naleznete v go help goauth.
Příkaz go build nyní nastavuje verzi základního modulu ve skompilovaném binárním souboru, vycházejícím z tagu a/nebo commitu systému řízení verzí. Přípona +dirty bude přidána v případě necommitovaných změn. Můžete použít příznak -buildvcs=false k tomu, abyste vynechali informace o řízení verzí z binárního souboru.
Nové nastavení GODEBUG toolchaintrace=1 nyní může být použito k sledování procesu výběru toolchainu v týmu go.
Cgo
Cgo podporuje nové anotace pro C funkce pro zlepšení výkonu za běhu. #cgo noescape cFunctionName říká překladači, že paměť předaná do funkce C cFunctionName neuniká. #cgo nocallback cFunctionName říká překladači, že funkce C cFunctionName neprovádí žádné zpětné volání na funkce Go. Více informací naleznete v dokumentaci cgo.
Cgo v současnosti odmítá kompilované volání C funkce, která má více nekompatibilních deklarací. Například, pokud je f deklarována jako současně void f(int) a void f(double), cgo nahlásí chybu místo možného vygenerování nesprávné posloupnosti volání f(0). Novinkou v této verzi je vylepšené rozpoznávání tohoto chybového stavu, když se nekompatibilní deklarace projevují v různých souborech. #67699.
Objdump
Nástroj objdump nyní podporuje disassemblování na 64-bitovém LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) a S390X (GOARCH=s390x).
Vet
Nový analyzátor tests hlásí běžné chyby v deklaracích testů, fuzzers, benchmarků a příkladů v testovacích balíčcích, jako jsou nesprávně formulovaná jména, nesprávné podpisy nebo příklady, které dokumentují neexistující identifikátory. Některé z těchto chyb mohou vést k selhání testů.
Existující analyzátor printf nyní hlásí diagnostiku volání ve formátu fmt.Printf(s), kde s je nes konstantní formátovací řetězec, bez dalších argumentů. Taková volání bývají téměř vždy chybou, protože hodnota s může obsahovat znak %; místo toho použijte fmt.Print. 60529. Tato kontrola má tendenci nacházet chyby ve stávajícím kódu, a proto se používá pouze tehdy, když verze jazyka (jak je uvedeno direktivou go v souboru go.mod nebo komentáři `//go:build) je alespoň Go 1.24, aby se předešlo selháním při pokračující integraci při aktualizaci na toolchain Go 1.24.
Stávající analyzátor buildtag nyní hlásí diagnostiku, když dojde k chybě. omezení verze sestavení. Go v direktivě //go:build. Například //go:build go1.23.1 se odkazuje na konkrétní vydání; místo toho použijte //go:build go1.23. #64127.
Stávající analyzátor copylock nyní hlásí diagnostiku, když proměnná deklarovaná ve trojitém cyklu 'for', jako například for i := iter(); done(i); i = next(i) { … }, obsahuje sync.Locker, jako je sync.Mutex. Go 1.22 změnil chování těchto cyklů na vytváření nové proměnné pro každou iteraci kopírováním hodnot z předchozí iterace; toto kopírování není bezpečné pro zámky. #66387.
GOCACHEPROG
Vnitřní binární soubor cmd/go a mechanismus pro testování cachování mohou nyní být realizovány podřízenými procesy, které realizují protokol JSON mezi nástrojem cmd/go a podřízeným procesem, jehož název je proměnná prostředí GOCACHEPROG. Dříve to bylo v GOEXPERIMENT. Podrobnosti protokolu lze vidět v dokumentaci.
Doba provádění
Několik zlepšení výkonu v runtime snížilo náklady na CPU o 2-3 % v průměru v souboru reprezentativních benchmarků. Výsledky se mohou lišit v závislosti na aplikaci. Tato zlepšení zahrnují nový vestavěný mapový implementaci založenou na Švédských Tabulkách, efektivnější alokaci paměti malých objektů a novou interní runtime implementaci mutexu.
Nová vestavěná implementace mapy a nový interní runtime mutex mohou být deaktivovány nastavením GOEXPERIMENT=noswissmap a GOEXPERIMENT=nospinbitmutex během sestavení.
Kompilátor
Kompilátor již zakazoval definování nových metod s typy příjemce, které byly generovány cgo, ale bylo možné obejít toto omezení prostřednictvím aliasu typu. Go 1.24 nyní vždy hlásí chybu, pokud příjemce odkazuje na generovaný cgo typ, přímo nebo nepřímo (prostřednictvím aliasového typu).
Linker
Linker nyní generuje identifikátor sestavení GNU (záznam ELF NT_GNU_BUILD_ID) na platformách ELF a UUID (načítací příkaz Mach-O LC_UUID) na macOS podle defaultu. Identifikátor sestavení nebo UUID se odvozuje z identifikátoru sestavení Go. To může být vypnuto flagem linkeru -B none, nebo přepsáno flagem linkeru -B 0xNNNN s uživatelsky zadanou hexadecimální hodnotou.
Roztočení
Jak bylo uvedeno v poznámkách k vydání Go 1.22, Go 1.24 nyní vyžaduje ke spuštění Go 1.22.6 nebo novější. Vývojáři očekávají, že Go 1.26 bude vyžadovat pro spuštění bodovou verzi Go 1.24 nebo novější.
Standardní knihovna
Omezený přístup k souborovému systému podle adresáře
Nový typ os.Root umožňuje provádět operace se souborovým systémem v rámci určitého adresáře.
Funkce os.OpenRoot otevírá adresář a vrací os.Root. Metody na os.Root pracují v tomto adresáři a neumožňují, aby cesty odkazovaly na umístění mimo adresář, včetně těch, které následují za symbolickými odkazy mimo adresář. Metody na os.Root odrážejí většinu operací se souborovým systémem dostupných v balíčku os, včetně například os.Root.Open, os.Root.Create, os.Root.Mkdir a os.Root.Stat.
Nová funkce benchmarku
Benchmarky nyní mohou využívat rychlejší a méně chybový způsob testing.B.Loop k iteraci benchmarku jako for b.Loop() { … } místo obvyklých cyklických struktur s účastí b.N jako for range b.N. To nabízí dvě významné výhody:
- Funkce benchmarku se provádí přesně jednou na každý -count, takže nákladné fáze nastavení a úklidu se provádějí pouze jednou.
- Parametry volání funkce a výsledky zůstávají naživu, což brání kompilátoru v plné optimalizaci těla smyčky.
Vylepšené finalizátory
Nová funkce runtime.AddCleanup je mechanismus úklidu, který je flexibilnější, efektivnější a méně náchylný k chybám než runtime.SetFinalizer. AddCleanup připojuje funkci úklidu k objektu, která se spustí, jakmile se objekt stane nedostupným. Na rozdíl od SetFinalizer však mohou být k jednomu objektu připojeny více úklidů, úklidy mohou být připojeny k vnitřním ukazatelům, úklidy obvykle nezpůsobují úniky, když objekty tvoří smyčku, a úklidy neoddalují uvolnění objektu nebo objektů, na které odkazuje. Nový kód by měl preferovat AddCleanup před SetFinalizer.
Nový balíček weak
Nový balíček weak poskytuje slabé ukazatele.
Slabé ukazatele jsou nízkoúrovňovým primitivem, které je poskytováno pro vytváření struktur, které efektivně využívají paměť, jako jsou slabé slovníky pro mapování hodnot, kanonizační slovníky pro cokoliv, co není pokryto balíčkem unique, a různými typy mezipamětí. Aby byly tyto případy použití podporovány, tato verze také poskytuje runtime.AddCleanup a maphash.Comparable.
Nový balíček crypto/mlkem
Nový balíček crypto/mlkem implementuje ML-KEM-768 a ML-KEM-1024.
ML-KEM je post-kvantový mechanismus výměny klíčů, dříve známý jako Kyber a specifikovaný v FIPS 203.
Nové balíčky crypto/hkdf, crypto/pbkdf2 a crypto/sha3
Nový balíček crypto/hkdf implementuje funkci výstupu klíče založenou na HMAC „Extract-and-Expand“ HKDF, jak je definováno v RFC 5869.
Nový balíček crypto/pbkdf2 implementuje funkci výstupu klíče založenou na hesle PBKDF2, jak je definováno v RFC 8018.
Nový balíček crypto/sha3 implementuje hashovací funkci SHA-3 a SHAKE a cSHAKE funkce rozšiřitelného výstupu, jak je definováno v FIPS 202.
Všechny tři balíčky jsou založeny na dříve existujících balíčcích golang.org/x/crypto/…
Soulad s FIPS 140-3
Tato verze zahrnuje novou sadu mechanismů pro zajištění souladu s FIPS 140-3.
Kryptografický modul Go je soubor interních balíčků standardní knihovny, které se průhledně používají k implementaci schválených algoritmů FIPS 140-3. Aplikace nevyžadují změny k použití kryptografického modulu Go pro schválené algoritmy.
Nová proměnná prostředí GOFIPS140 může být použita k výběru verze kryptografického modulu Go pro použití při sestavení. Nová nastavení GODEBUG fips140 může být použita k aktivaci režimu FIPS 140-3 během běhu.
Go 1.24 zahrnuje kryptografický modul Go verze v1.0.0, který je v současné době testován akreditovanou laboratoří CMVP.
Nový experimentální balíček testing/synctest
Nový experimentální balíček testing/synctest poskytuje podporu pro testování konkurenčního kódu.
- Funkce synctest.Run spouští skupinu gorutin v izolované „bublině“. V bublině funkce balíčku čas pracují na falešných hodinách.
- Funkce synctest.Wait čekají, až se všechny gorutiny zablokují v aktuální bublině.
Podrobnosti lze vidět v dokumentaci balíčku.
Balíček synctest je experimentální a musí být aktivován nastavením GOEXPERIMENT=synctest. API balíčku se může v budoucích verzích změnit. V #67434 můžete vidět více podrobností a poskytnout zpětnou vazbu.
Drobné změny v knihovně
archive
Implementace (*Writer.AddFS) v archive/zip a archive/tar nyní zapisují hlavičku adresáře pro prázdný adresář.
bytes
Balíček bytes přidává několik funkcí, které pracují s iterátory:
- Lines vrací iterátor po řádcích rozdělených novou linií v řezané bajtové mřížce.
- SplitSeq vrací iterátor pro všechny podslísy bajtového řezu, rozděleného separátorem.
- SplitAfterSeq vrací iterátor pro podslísy bajtového řezu, rozděleného po každém výskytu separátoru.
- FieldsSeq vrací iterátor pro podslísy bajtového řezu kolem sekvencí znaků bílé mezery, jak je definováno. unicode.IsSpace
- FieldsFuncSeq vrací iterátor pro podslísy bajtového řezu kolem sekvencí kódových bodů Unicode, které vyhovují predikátu.
crypto/aes
Hodnota, která je vracena NewChipher už více neimplementuje metody NewCTR, NewGCM, NewCBCEncrypter a NewCBCDecrypter. Tyto metody byly nedokumentované a nebyly dostupné na všech architekturách. Nyní hodnota Block musí být předávána přímo do příslušných funkcí crypto/cipher. V současnosti crypto/cipher stále kontroluje tyto metody na hodnotách Block, i když už nejsou podporovány standardní knihovnou.
crypto/cipher
Nová funkce NewGCMWithRandomNonce vrací AEAD, která implementuje AES-GCM, generuje náhodné jednorázové číslo během Seal a přidává ho na začátek šifrovaného textu.
Implementace Stream, vrácená NewCTR při použití s crypto/aes nyní několikrát rychleji na amd64 a arm64.
NewOFB, NewCFBEncrypter a NewCFBDecrypter nyní jsou označeny jako zastaralé. Režimy OFB a CFB nejsou autentizované, což obecně umožňuje aktivním útokům manipulovat a obnovit otevřený text. Aplikacím se doporučuje používat AEAD místo toho. Pokud je neautentizovaný režim Stream nezbytný, lze použít NewCTR místo toho.
crypto/ecdsa
PrivateKey.Sign nyní vytváří deterministický podpis podle RFC 6979, pokud je zdroj náhody nil.
crypto/md5
Hodnota, která je vracena md5.New, nyní také implementuje rozhraní encoding.BinaryAppender.
crypto/rand
Funkce Číst nyní zaručuje absenci chyb. Pokud Read narazí na chybu během čtení Reader, program neodvolatelně ukončí. Všimněte si, že výchozí Reader je dokumentováno, že vždy úspěšně funguje, takže tato změna by měla ovlivnit pouze ty programy, které přepisují proměnnou Reader. Jedinou výjimkou jsou jádra Linuxu před verzí 3.17, kde výchozí Reader stále otevírá /dev/urandom a může selhat.
Na Linuxu 6.11 a později Reader nyní používá systémové volání getrandom přes vDSO. To je několikrát rychlejší, obvykle pro malé čtení.
Na OpenBSD Reader nyní používá arc4random_buf(3).
Nová funkce Text nyní může generovat kryptograficky bezpečné náhodné řetězce textu.
crypto/rsa
GenerateKey nyní vrací chybu, pokud je požadován klíč méně než 1024 bitů. Všechny metody Sign, Verify, Encrypt a Decrypt nyní vrací chybu, pokud jsou použity s klíčem menší než 1024 bitů. Takové klíče jsou nebezpečné a neměly by být používány. Nastavení GODEBUG rsa1024min=0 obnovuje staré chování, ale vývojáři Go doporučují dělat to pouze v případě potřeby a pouze v testech, například přidáním řádku //go:debug rsa1024min=0 do testovacího souboru. Nový příklad GenerateKey poskytuje snadno použitelný standardní 2024-bitový testovací klíč.
Nyní je bezpečné a efektivnější volat PrivateKey.Precompute do PrivateKey.Validate. Precompute je nyní rychlejší v přítomnosti částečně vyplněného PrecomputedValues, například při extrakci klíče z JSON.
Balíček nyní odmítá více nesprávných klíčů, i když Validate není voláno, a GenerateKey nyní může vrátit nové chyby pro nefunkční zdroje náhodnosti. Pole Primes a Precomputed struktury PrivateKey nyní jsou používána a ověřována i když některé hodnoty chybí. Byly také provedeny změny v crypto/x509 ohledně rozboru a extrakce RSA klíčů, jak je popsáno níže.
SignPKCS1v15 a VerifyPKCS1v15 nyní podporují SHA-512/224, SHA-512/256 a SHA-3.
GenerateKey nyní používá trochu jinou metodu pro generování soukromé exponenciály (Karmichaelova funkce namísto Eulerovy funkce). Řídce používané aplikace, které znovu vytvářejí klíče pouze z prvočísel, mohou vytvářet různé, ale kompatibilní výsledky.
Operace s veřejnými a soukromými klíči jsou nyní až dvakrát rychlejší na wasm.
crypto/sha*
- crypto/sha1: hodnota vrácená sha1.New nyní také implementuje rozhraní encoding.BinaryAppender.
- crypto/sha256: hodnoty vrácené sha256.New a sha256.New224 nyní také implementují rozhraní encoding.BinaryAppender.
- crypto/sha512: hodnoty vrácené sha512.New, sha512.New384, sha512.New512_224 a sha512.New512_256, nyní také implementují rozhraní encoding.BinaryAppender.
crypto/subtle
Nová funkce WithDataIndependentTiming umožňuje uživateli vykonávat funkci se zapnutými funkcemi specifickými pro architekturu, které zaručují neměnnost určitých instrukcí vzhledem k času hodnoty dat. To může být použito k zajištění, že kód navržený k provozu v konstantním čase nebyl optimalizován funkcemi úrovně procesoru takovým způsobem, že běží v proměnlivém čase. V současnosti WithDataIndependentTiming používá bit PSTATE.DIT na arm64 a na všech ostatních architekturách nedělá nic. Nastavení GODEBUG dataindependenttiming=1 zapíná režim DIT pro celý program Go.
Výstup XORBytes musí být zcela překryt nebo vůbec s vstupem. Dřívější chování bylo neurčené v opačném případě, zatímco nyní XORBytes zpanikaří.
crypto/tls
Server TLS nyní podporuje Encrypted Client Hello (ECH). Tato funkce může být povolena vyplněním pole Config.EncryptedClientHelloKeys.
Nový post-kvantový mechanismus výměny klíčů X25519MLKEM768 nyní je podporován a je povolen ve výchozím nastavení, když Config.CurvePreferences je nil. Nastavení GODEBUG tlsmlkem=0 vrací výchozí hodnotu.
Podpora experimentální výměny klíčů X25519Kyber768Draft00 byla odstraněna.
Pořadí výměny klíčů nyní zpracovává plně balíček crypto/tls. Pořadí Config.CurvePreferences je nyní ignorováno a obsah se používá pouze k určení, které výměny klíčů zahrnout, když je pole vyplněno.
Nové pole ClientHelloInfo.Extensions vyjmenovává seznam identifikátorů rozšíření získaných v zprávě Client Hello. To může být užitečné pro fingerprinting klientů TLS.
crypto/x509
Nastavení GODEBUG x509sha1 byla odstraněna. Certficicate.Verify již nepodporuje podpisy založené na SHA-1.
OID nyní implementuje rozhraní encoding.BinaryAppender a encoding.TextAppender.
Výchozí pole politik certifikátu bylo změněno z Certificate.PolicyIdentifiers na Certificate.Policies. Při analýze certifikátů budou obě pole vyplněna, ale při vytváření politik certifikátů budou brány v úvahu z pole Certificate.Policies namísto Certificate.PolicyIdentifiers. Tato změna může být vrácena nastavením GODEBUG x509usepolicies=0.
CreateCertificate nyní bude generovat sériové číslo pomocí metody kompatibilní s RFC 5280 při předávání šablony polem Certificate.SerialNumber nil, místo zkratu.
Certificate.Verify nyní podporuje validaci politiky, jak je definováno v RFC 5280 a RFC 9618. Nové pole VerifyOptions.CertificatePolicies může být nastavena na akceptovatelnou sadu politik OIDs. Pouze řetězce certifikátů s platnými grafy politik budou vráceny z Certificate.Verify.
MarshalPKCS8PrivateKey nyní vrací chybu místo extrakce nesprávného RSA klíče. (MarshalPKCS1PrivateKey nevrací chybu a jeho chování při dodaných nesprávných klíčích zůstává neurčité.)
ParsePKCS1PrivateKey a ParsePKCS8PrivateKey nyní používají a validují zakódované hodnoty CRT, takže mohou odmítnout neplatné RSA klíče, které byly dříve akceptovány. Použití nastavení GODEBUG x509rsacrt=0 vrací k přepočítávání hodnot CRT.
debug/elf
Balíček debug/elf přidává podporu pro zpracování verzí symbolů v dynamických souborech ELF (Executable and Linkable Format). Nová metoda File.DynamicVersions vrací seznam dynamických verzí definovaných v souboru ELF. Nová metoda File.DynamicVersionNeeds vrací seznam dynamických verzí požadovaných tímto souborem ELF, které jsou definovány v jiných ELF objektech. Nakonec nová pole Symbol.HasVersion a Symbol.VersionIndex určují verzi symbolu.
encoding
Dva nové rozhraní TextAppender a BinaryAppender byly zavedeny pro přidání textového nebo binárního zobrazení objektu do byte slice. Tato rozhraní poskytují stejnou funkčnost jako TextMarshaler a BinaryMarshaler, ale místo alokace nového slice pokaždé, přidávají data přímo do existujícího slice. Tato rozhraní nyní implementují typy standardní knihovny, které již implementují TextMarshaler a/nebo BinaryMarshaler.
encoding/json
Při skládání bude pole struktury s novou možností omitzero v tagu pole struktury opuštěno, pokud má hodnotu nula. Pokud má typ pole metodu IsZero() bool, ta bude použita k určení, zda je hodnota nulová. Jinak bude hodnota nulová, pokud je nula pro svůj typ. Tag pole omitzero je čistší a méně náchylný k chybám než omitempty, když je záměrem opustit nulové hodnoty. Zvláště na rozdíl od omitempty omitzero opouští nulové time.Time hodnoty, což je častý zdroj problémů.
Pokud jsou zadány oba omitempty a omitzero, pole bude opuštěno, pokud je hodnota prázdná nebo nulová (nebo obojí současně).
UnmarshalTypeError.Field nyní zahrnuje vestavěné struktury pro poskytování podrobnějších zpráv o chybách.
go/types
Všechny struktury dat go/types, které odhalují posloupnosti dvojice metod, jako Len() int a At(int) T, nyní rovněž mají metody, které vrací iterátory, což umožňuje zjednodušit kód jako je tento:
params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }
K tomu:
for param := range fn.Signature().Params().Variables() { use(param) }
Metody: 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: hodnota vrácená Nové, nyní také implementuje rozhraní encoding.BinaryAppender
- hash/crc32: hodnoty vrácené Nové a NewIEEE, nyní také implementují rozhraní encoding.BinaryAppender
- hash/crc64: hodnota vrácená Nové, nyní také implementuje rozhraní encoding.BinaryAppender
- hash/fnv: hodnoty vrácené New32 New32a New64 New64a New128 a New128a, nyní také implementují rozhraní encoding.BinaryAppender
- hash/maphash: nové funkce Comparable a WriteComparable mohou počítat hash jakékoli hodnoty, která je srovnatelná. To umožňuje hashovat cokoliv, co může být použito jako klíč slovníku Go.
log/slog
Nový DiscardHandler je handler, který nikdy není aktivován a vždy zahazuje svůj výstup.
Úroveň a LevelVar nyní implementuje rozhraní encoding.TextAppender.
math/*
- math/big: Float, Int a Rat nyní implementuje rozhraní encoding.TextAppender.
- math/rand: volání zastaralé vysoceúrovňové funkce Seed již nemají žádný efekt. Pro obnovení starého chování můžete použít nastavení GODEBUG randseednop=0. Více kontextu v výroku 67273.
- math/rand/v2: ChaCha8 a PCG nyní implementuje rozhraní encoding.BinaryAppender.
net
ListenCondig nyní používá MPTCP jako výchozí na systémech, kde je to podporováno (prozatím pouze Linux).
IP nyní implementuje rozhraní encoding.TextAppender.
net/http
Bylo změněno omezení Transport na obdržené informační odpovědi 1xx v reakci na požadavek. Dříve to zastavilo požadavek a vrátilo chybu po obdržení více než 5 odpovědí 1xx. Nyní to vrací chybu pouze pokud celková velikost všech odpovědí 1xx překračuje nastavení konfigurace Transport.MaxResponseHeaderBytes.
Kromě toho, když má požadavek hook pro sledování net/http/httptrace.ClientTrace.Got1xxResponse, nyní neexistuje žádné omezení na celkový počet odpovědí 1xx. Hook Got1xxResponse může vrátit chybu pro zastavení požadavku.
Transport a Server nyní mají pole HTTP2, které umožňuje konfigurovat nastavení protokolu HTTP/2.
Nová pole Server.Protocols a Transport.Protocols poskytují jednoduchý způsob, jak konfigurovat, jaké protokoly HTTP server nebo klient používají.
Server a klient mohou být nakonfigurováni tak, aby podporovali nezašifrovaná připojení HTTP/2.
Když Server.Protocols obsahuje UnencrypterHTTP2, server přijme připojení HTTP/2 na nezašifrované porty. Server může přijmout jak HTTP/1, tak nezašifrovaný HTTP/2 na stejném portu.
Když Transport.Protocols obsahuje UnencryptedHTTP2 a neobsahuje HTTP1, transport bude používat nezašifrovaný HTTP/2 pro adresy http://. Pokud je transport nakonfigurován k použití zároveň HTTP/1 a nezabezpečeného HTTP/2, bude používat HTTP/1.
Podpora nezabezpečeného HTTP/2 používá „HTTP/2 s předběžným věděním“ (RFC 9113, oddíl 3.3). Zastaralý záhlaví „Upgrade: h2c“ není podporováno.
net/netip
Addr, AddrPort a Prefix nyní implementují rozhraní encoding.BinaryAppender a encoding.TextAppender.
net/url
URL nyní také implementuje rozhraní encoding.BinaryAppender.
os/user
V systému Windows Current nyní může být použit v systému Windows Nano Server. Implementace byla aktualizována, aby se předešlo využívání funkcí z knihovny NetApi32, která v Nano Serveru chybí.
V systému Windows Current, Lookup a LookupId nyní podporují následující vestavěné uživatelské servisní účty:
- NT AUTHORITY\SYSTEM
- NT AUTHORITY\LOCAL SERVICE
- NT AUTHORITY\NETWORK SERVICE
V systému Windows Current byla výrazně zrychlena, když je aktuální uživatel připojen k pomalé doméně, což je běžné pro mnoho firemních uživatelů. Nový výkon implementace nyní trvá milisekundy, ve srovnání s předchozí implementací, která mohla trvat několik sekund, dokonce i minut, než byla dokončena.
V systému Windows Current nyní vrací uživatele vlastníka procesu, když aktuální vlákno se vydává za jiného uživatele. Dříve to vracelo chybu.
regexp
Regexp nyní implementuje rozhraní encoding.TextAdapter.
runtime
Funkce GOROOT nyní byla prohlášena za zastaralou. V novém kódu by mělo být upřednostněno použití systémové cesty pro určení binárního souboru „go“, a používat go env GOROOT pro určení GOROOT.
strings
Balíček strings přidává několik funkcí pro práci s iterátory:
- Lines vrací iterátor na řádky rozdělené novou linií ve stringu.
- SplitSeq vrací iterátor na všechny podřetězce stringu oddělené oddělovačem.
- SplitAfterSeq vrací iterátor na podřetězce stringu oddělené po každém výskytu oddělovače.
- FieldsSeq vrací iterátor na podřetězce stringu kolem sekvencí znaků bílé barvy, jak je definovánounicode.IsSpace
- FieldsFuncSeq vrací iterátor na podřetězce stringu kolem sekvencí kódových bodů unicode, které splňují predikát.
sync
Implementace sync.Map byla změněna, což zlepšuje výkon, zejména pro změny slovníku. Například je méně pravděpodobné, že dojde ke konfliktu změn nesouvisejících sad v rozsáhlých slovnících, a není třeba časového nárazníku pro dosažení nízkého konfliktu zátěže slovníku.
Pokud narazíte na nějaké problémy, nastavte GOEXPERIMENT=nosynchashtriemap během kompilace, abyste se vrátili k staré implementaci, a prosím, vyplňte formulář pro hlášení problémů.
testing
Nové metody T.Context a B.Context vrací kontext, který je zrušen po dokončení testu a před provedením čistících funkcí testu.
Nové metody T.Chdir a B.Chdir mohou být použity k změně pracovní adresáře na dobu trvání testu nebo benchmarku.
text/template
Šablony nyní podporují range-over-func a range-over-int.
čas
Čas nyní implementuje rozhraní encoding.BinaryAppender a encoding.TextAppender.
Porty
Linux
Jak bylo oznámeno v poznámkách k vydání Go 1.23, Go 1.24 vyžaduje jádro Linux verze 3.2 nebo novější.
Darwin
Go 1.24 je poslední verze, která bude fungovat na macOS 11 Big Sur. Go 1.25 bude vyžadovat macOS 12 Monterey nebo novější.
WebAssembly
Kompilační direktiva go:wasmexport byla přidána do programů Go pro export funkcí do hostitele WebAssembly.
V Preview 1 WebAssembly System Interface (GOOS=wasip1 GOARCH=wasm) Go 1.24 podporuje kompilaci programu Go jako reactor/library zadáním přepínače kompilace -buildmode=c-shared.
Více typů je nyní povoleno jako typ argumentu nebo výstupu pro funkce go:wasmimport. Zejména jsou povoleny typy bool, string, uintptr a ukazatele na určité typy (podrobnosti lze vidět v dokumentaci), spolu s 32-bitovými a 64-bitovými typy celých čísel a s plovoucí desetinnou čárkou a unsafe.Pointer, které jsou již povoleny. Tyto typy jsou také povoleny jako typy argumentu nebo výstupu pro funkce go:wasmexport.
Podporující soubory pro WebAssembly byly přesunuty do lib/wasm z misc/wasm.
Počáteční velikost paměti byla značně zmenšena, zejména pro malé aplikace WebAssembly.
Windows
32-bitový port windows/arm (GOOS=windows GOARCH=arm) byl označen jako nefunkční. Podrobnosti v #70705
Zdroj: linux.org.ru
