Go 1.24

Go 1.24

Nowa wersja języka Go, wersja 1.24, pojawia się sześć miesięcy po Go 1.23. Większość zmian dotyczy realizacji narzędzi, czasu działania i bibliotek. Jak zawsze, wydanie zapewnia obietnicę zgodności Go 1. Programiści tego języka spodziewają się, że prawie wszystkie programy Go będą nadal kompilowane i działać jak wcześniej.

Zmiany w języku

Go 1.24 teraz w pełni wspiera ogólne aliasy typów: alias typu może być parametryzowany jako typ zadeklarowany. Szczegóły można znaleźć w specyfikacji języka. Do tej pory możliwość ta może być wyłączona ustawieniem GOEXPERIMENT=noaliastypeparams; jednak opcja aliastypeparams zostanie usunięta w Go 1.25.

Narzędzia

Komenda go

Moduły go mogą teraz śledzić zależności wykonawcze korzystając z dyrektywy tool w go.mod. Eliminuje to potrzebę wcześniejszego obejścia, które polegało na dodawaniu narzędzi jako pustych importów do pliku, zwykle nazywanego „tools.go”. Komenda go tool może teraz uruchamiać te narzędzia, oprócz narzędzi dostarczanych wraz z Go. Więcej informacji można znaleźć w dokumentacji.

Nowy flag -tool dla go get prowadzi do dodania dyrektywy narzędzia w bieżącym module dla wskazanych pakietów, oprócz dodawania dyrektyw wymagań.

Nowy meta-wzorzec tool odnosi się do wszystkich narzędzi w bieżącym module. Może to być użyte do ich wszystkich aktualizacji poprzez go get tool lub do zainstalowania ich w swoim katalogu GOBIN za pomocą go install tool.

Pliki wykonywalne stworzone za pomocą go run oraz nowe zachowanie go tool są teraz przechowywane w pamięci podręcznej kompilacji Go. Ułatwia to powtarzające się uruchomienia dzięki powiększonej pamięci podręcznej. #69290.

Polecenia go build i go install teraz przyjmują flag -json, która raportuje wyniki i błędy kompilacji jako zorganizowany zbiór wyjściowy JSON na standardowym wyjściu. Szczegóły formatu można zobaczyć w go help buildjson.

Co więcej, go test -json teraz raportuje wyniki i błędy kompilacji w JSON, zmieszane z JSON-em wyników testowania. Można je rozróżnić według nowych typów akcji, ale jeśli powodują problemy w systemie integracji testów, można powrócić do tekstowego wyjścia kompilacji poprzez ustawienie GODEBUG gotestjsonbuildtext=1.

Nowa zmienna środowiskowa GOAUTH zapewnia elastyczny sposób autoryzowania prywatnych pobrań modułów. Szczegóły można zobaczyć w go help goauth.

Komenda go build jest teraz instalowana wersja podstawowego modułu w skompilowanym binarnym pliku, w zależności od tagu i/lub commitu systemu kontroli wersji. Przy braku zaimplementowanych zmian dodany zostanie sufiks +dirty. Można użyć flagi -buildvcs=false, aby pominąć informacje o kontroli wersji w binarnym pliku.

Nowa konfiguracja GODEBUG toolchaintrace=1 może teraz być używane do śledzenia procesu wyboru toolchainu w zespole go.

Cgo

Cgo obsługuje nowe adnotacje dla funkcji C, aby poprawić wydajność czasu wykonywania. #cgo noescape cFunctionName informuje kompilator, że pamięć przekazywana do funkcji C cFunctionName nie ucieka. #cgo nocallback cFunctionName informuje kompilator, że funkcja C cFunctionName nie wywołuje żadnych funkcji Go. Więcej informacji można znaleźć w dokumentacji cgo.

Cgo obecnie odrzuca kompilację wywołań funkcji C, które mają wiele niekompatybilnych deklaracji. Na przykład, jeśli f jest zadeklarowane zarówno jako void f(int), jak i void f(double), cgo zgłosi błąd zamiast możliwej generacji niepoprawnej sekwencji wywołania f(0). Nowością w tej wersji jest lepsze wykrywanie tego stanu błędu, gdy niekompatybilne deklaracje pojawiają się w różnych plikach. #67699.

Objdump

Narzędzie objdump teraz obsługuje disasembly dla 64-bitowego LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) i S390X (GOARCH=s390x).

Vet

Nowy analizator tests zgłasza powszechne błędy w deklaracjach testów, fuzzers, benchmarków i przykładów w pakietach testowych, takie jak źle sformułowane nazwy, nieprawidłowe sygnatury lub przykłady, które dokumentują nieistniejące identyfikatory. Niektóre z tych błędów mogą prowadzić do niewykonania testów.

Istniejący analizator printf teraz zgłasza diagnostykę wywołań w formie fmt.Printf(s), gdzie s to niekonstansowy łańcuch formatu, bez innych argumentów. Takie wywołania prawie zawsze są błędem, ponieważ wartość s może zawierać symbol %; zamiast tego użyj fmt.Print. 60529. Ta kontrola ma tendencję do wykrywania błędów w istniejącym kodzie, dlatego jest stosowana tylko wtedy, gdy wersja języka (określona przez dyrektywę go w pliku go.mod lub komentarzami `//go:build) jest co najmniej Go 1.24, aby uniknąć awarii długoterminowej integracji podczas aktualizacji do toolchainu Go 1.24.

Istniejący analizator buildtag teraz zgłasza diagnostykę, gdy jest nieprawidłowe ograniczenie starszej wersji kompilacji Go w dyrektywie //go:build. Na przykład, //go:build go1.23.1 odnosi się do wydania punktowego; zamiast tego użyj //go:build go1.23. #64127.

Istniejący analizator copylock teraz zgłasza diagnostykę, gdy zmienna zadeklarowana w trójpierwiastkowej pętli for, takiej jak for i := iter(); done(i); i = next(i) { … }, zawiera sync.Locker, taki jak sync.Mutex. Go 1.22 zmienił zachowanie takich pętli na tworzenie nowej zmiennej przy każdej iteracji, kopiując wartości z poprzedniej iteracji; to kopiowanie nie jest bezpieczne dla blokad. #66387.

GOCACHEPROG

Wewnętrzny binarny plik cmd/go oraz mechanizm cache'owania testów mogą teraz być realizowane przez procesy podrzędne implementujące protokół JSON pomiędzy narzędziem cmd/go a procesem podrzędnym, nazwanym zmienną środowiskową GOCACHEPROG. Wcześniej była to ustawiana jako GOEXPERIMENT. Szczegóły protokołu można zobaczyć w dokumentacji.

Czas wykonania

Kilka ulepszeń wydajności w czasie działania zmniejszyło obciążenie CPU o 2-3% średnio wśród zestawu reprezentatywnych benchmarków. Wyniki mogą się różnić w zależności od aplikacji. Ulepszenia te obejmują nową wbudowaną implementację mapy opartą na Szwedzkich Tablicach, bardziej efektywne przydzielanie pamięci małych obiektów oraz nową wewnętrzną implementację mutexów w czasie działania.

Nowa wbudowana implementacja mapy oraz nowy wewnętrzny mutex w czasie działania mogą być wyłączone za pomocą ustawień GOEXPERIMENT=noswissmap oraz GOEXPERIMENT=nospinbitmutex podczas budowy odpowiednio.

Kompilator

Kompilator już zabraniał definiowania nowych metod z typami odbiorcy, które były generowane przez cgo, ale możliwe było obejście tego ograniczenia poprzez alias typu. Go 1.24 teraz zawsze zgłasza błąd, jeśli odbiorca oznacza typ generowany przez cgo, bezpośrednio lub pośrednio (poprzez alias typu).

Linker

Linker teraz generuje identyfikator kompilacji GNU (zapisy ELF NT_GNU_BUILD_ID) na platformach ELF i UUID (polecenie ładowania Mach-O LC_UUID) na macOS domyślnie. Identyfikator kompilacji lub UUID jest wyprowadzany z identyfikatora kompilacji Go. Można to wyłączyć flagą linkera -B none, lub nadpisać flagą linkera -B 0xNNNN z podaną przez użytkownika wartością szesnastkową.

Wydanie

Jak zostało wskazane w uwagach dotyczących wydania Go 1.22, Go 1.24 wymaga teraz Go 1.22.6 lub nowszego do kompilacji. Oczekuje się, że Go 1.26 będzie wymagać poprawki Go 1.24 lub nowszego do kompilacji.

Biblioteka standardowa

Ograniczony dostęp do systemu plików w obrębie katalogu

Nowy typ os.Root umożliwia wykonywanie operacji na systemie plików w obrębie określonego katalogu.

veth_xdp_flush_bq() os.OpenRoot otwiera katalog i zwraca os.Root. Metody na os.Root operują w tym katalogu i nie pozwalają na odniesienia do lokalizacji poza katalogiem, w tym tych, które prowadzą przez dowiązania symboliczne poza katalog. Metody na os.Root odzwierciedlają większość operacji systemu plików dostępnych w pakiecie os, w tym na przykład os.Root.Open, os.Root.Create, os.Root.Mkdir i os.Root.Stat.

Nowa funkcja benchmarkowa

Benchmarki mogą teraz używać szybszej i mniej podatnej na błędy metody testing.B.Loop do iteracji benchmarków, jak for b.Loop() { ... } zamiast typowych struktur pętli z udziałem b.N, jak for range b.N. To oferuje dwie znaczące zalety:

  • Funkcja benchmarkowa jest wykonywana dokładnie raz dla każdego -count, dzięki czemu kosztowne kroki przygotowawcze i czyszczenia są wykonywane tylko raz.
  • Parametry wywołania funkcji i wyniki pozostają dostępne, zapobiegając pełnej optymalizacji ciała pętli przez kompilator.

Ulepszone finalizatory

Nowa funkcja runtime.AddCleanup jest elastycznym, bardziej efektywnym i mniej podatnym na błędy mechanizmem sprzątania niż runtime.SetFinalizer. AddCleanup przypisuje funkcję czyszczącą do obiektu, która zostanie uruchomiona, gdy obiekt stanie się niedostępny. W przeciwieństwie do SetFinalizer jednak, wiele funkcji sprzątających może być przypisanych do jednego obiektu, sprzątania mogą być przypisane do wskaźników wewnętrznych, a sprzątania zazwyczaj nie powodują wycieków, gdy obiekty tworzą cykl, i sprzątania nie odkładają zwolnienia obiektu lub obiektów, na które on wskazuje. Nowy kod powinien preferować AddCleanup względem SetFinalizer.

Nowy pakiet weak

Nowy pakiet weak zapewnia słabe wskaźniki.

Słabe wskaźniki są niskopoziomowym prymitywem, który umożliwia tworzenie struktur wykorzystujących pamięć efektywnie, takich jak słabe słowniki do mapowania wartości, słowników kanonizacyjnych do czegokolwiek, co nie jest pokryte pakietem unique, i różnych rodzajów pamięci podręcznej. Aby wspierać te przypadki użycia, ta wersja również udostępnia runtime.AddCleanup i maphash.Comparable.

Nowy pakiet crypto/mlkem

Nowy pakiet crypto/mlkem implementuje ML-KEM-768 i ML-KEM-1024.

ML-KEM jest post-kwantowym mechanizmem wymiany kluczy, wcześniej znanym jako Kyber i specyfikowanym w FIPS 203.

Nowe pakiety crypto/hkdf, crypto/pbkdf2 i crypto/sha3

Nowy pakiet crypto/hkdf implementuje opartą na HMAC funkcję wyjściową klucza 'Extract-and-Expand' HKDF, jak określono w RFC 5869.

Nowy pakiet crypto/pbkdf2 implementuje opartą na haśle funkcję wyjściową klucza PBKDF2, jak określono w RFC 8018.

Nowy pakiet crypto/sha3 implementuje funkcję haszującą SHA-3 oraz funkcje SHAKE i cSHAKE o rozszerzonym wyjściu, jak określono w FIPS 202.

Wszystkie trzy pakiety bazują na wcześniej istniejących pakietach golang.org/x/crypto/….

Zgodność FIPS 140-3

Ta wersja zawiera nowy zestaw mechanizmów do zapewnienia zgodności z FIPS 140-3.

Moduł kryptograficzny Go jest zbiorem wewnętrznych pakietów standardowej biblioteki, które są transparantnie używane do implementacji zatwierdzonych algorytmów FIPS 140-3. Aplikacje nie wymagają zmian, aby móc używać modułu kryptograficznego Go do zatwierdzonych algorytmów.

Nowa zmienna środowiskowa GOFIPS140 może być użyta do wyboru wersji modułu kryptograficznego Go do wykorzystania w kompilacji. Nowa konfiguracja GODEBUG fips140 może być użyta do włączenia trybu FIPS 140-3 w trakcie działania.

Go 1.24 zawiera wersję v1.0.0 modułu kryptograficznego Go, która obecnie jest testowana z akredytowanym laboratorium CMVP.

Nowy eksperymentalny pakiet testing/synctest

Nowy eksperymentalny pakiet testing/synctest oferuje wsparcie dla testowania współbieżnego kodu.

  • veth_xdp_flush_bq() synctest.Run uruchamia grupę gorutin w izolowanej 'bańce'. W bańce funkcje pakietu time operują na fałszywych zegarach.
  • Funkcje synctest.Wait oczekują, aż wszystkie gorutyny zostaną zablokowane w bieżącej bańce.

Szczegóły można zobaczyć w dokumentacji pakietu.

Pakiet synctest jest eksperymentalny i musi być włączony poprzez ustawienie GOEXPERIMENT=synctest. API pakietu może się zmienić w przyszłych wersjach. W #67434 można zobaczyć więcej szczegółów i przesłać opinię.

Niewielkie zmiany w bibliotece

archive

Implementacje (*Writer.AddFS) w archive/zip i archive/tar teraz zapisują nagłówek katalogu dla pustego katalogu.

bytes

Pakiet bytes dodaje kilka funkcji, które działają z iteratorami:

  • Lines zwraca iterator po linii podzielonych nową linią w ciągu bajtów.
  • SplitSeq zwraca iterator dla wszystkich podprzedziałów tablicy bajtów, podzielonej separatorem.
  • SplitAfterSeq zwraca iterator dla podprzedziałów tablicy bajtów, podzielonej po każdym wystąpieniu separatora.
  • FieldsSeq zwraca iterator dla podprzedziałów tablicy bajtów wokół sekwencji spacji, jak określono. unicode.IsSpace
  • FieldsFuncSeq zwraca iterator dla podprzedziałów tablicy bajtów wokół sekwencji punktów kodowych Unicode, spełniających predykat.

crypto/aes

Wartość zwracana NewChipher już nie implementuje metod NewCTR, NewGCM, NewCBCEncrypter i NewCBCDecrypter. Te metody były nieudokumentowane i nie były dostępne na wszystkich architekturach. Teraz wartość Block musi być przekazywana bezpośrednio do odpowiednich funkcji crypto/cipher. Na dzień dzisiejszy crypto/cipher nadal sprawdza te metody dla wartości Block, nawet jeśli nie są już wspierane przez standardową bibliotekę.

crypto/cipher

Nowa funkcja NewGCMWithRandomNonce zwraca AEAD, który implementuje AES-GCM, generując losowy jednokrotnego użycia numer w czasie Seal i dodając go na początku zaszyfrowanego tekstu.

Realizacja Stream, zwracana NewCTR przy użyciu z crypto/aes jest teraz wielokrotnie szybsza na amd64 i arm64.

NewOFB, NewCFBEncrypter i NewCFBDecrypter są teraz oznaczone jako przestarzałe. Tryby OFB i CFB są nieautoryzowane, co generalnie pozwala aktywnym atakom na manipulację i przywracanie jawnego tekstu. Aplikacjom zaleca się użycie AEAD zamiast. Jeśli nieautoryzowany tryb Stream jest konieczny, można użyć NewCTR zamiast.

crypto/ecdsa

PrivateKey.Sign teraz tworzy deterministyczny podpis zgodnie z RFC 6979, jeśli źródło losowości nil.

crypto/md5

Wartość zwracana md5.New, teraz również implementuje interfejs encoding.BinaryAppender.

crypto/rand

veth_xdp_flush_bq() Odczyt teraz zapewnia brak niepowodzeń. Jeśli Read napotka błąd podczas czytania Reader, program bezpowrotnie zakończy działanie. Należy zauważyć, że domyślny Reader jest udokumentowany jako zawsze działający pomyślnie, więc ta zmiana powinna dotknąć tylko te programy, które nadpisują zmienną Reader. Jedynym wyjątkiem są jądra Linux przed wersją 3.17, gdzie domyślny Reader nadal otwiera /dev/urandom i może zakończyć się niepowodzeniem.

Na Linux 6.11 i później Reader teraz wykorzystuje wywołanie systemowe getrandom przez vDSO. Jest to wielokrotnie szybsze, zazwyczaj dla niewielkich odczytów.

Na OpenBSD Reader teraz używa arc4random_buf(3).

Nowa funkcja Tekst teraz może generować kryptograficznie bezpieczne losowe ciągi tekstu.

crypto/rsa

GenerateKey teraz zwraca błąd, jeśli żądany klucz ma długość mniejszą niż 1024 bity. Wszystkie metody Sign, Verify, Encrypt i Decrypt teraz zwracają błąd, jeśli są używane z kluczem mniejszym niż 1024 bity. Takie klucze są niebezpieczne i nie powinny być używane. Konfiguracja GODEBUG rsa1024min=0 przywraca wcześniejsze zachowanie, ale deweloperzy Go zalecają to tylko w razie konieczności i tylko w testach, na przykład dodając linię //go:debug rsa1024min=0 do pliku testowego. Nowy przykład GenerateKey zapewnia łatwy w użyciu standardowy 2024-bitowy klucz testowy.

Teraz bezpiecznie i bardziej efektywnie wywołuj PrivateKey.Precompute do PrivateKey.Validate. Precompute jest teraz szybsze w obecności częściowo wypełnionych PrecomputedValues, na przykład podczas wyodrębniania klucza z JSON.

Pakiet teraz odrzuca więcej niepoprawnych kluczy, nawet gdy Validate nie jest wywoływana, i GenerateKey teraz może zwrócić nowe błędy dla uszkodzonych źródeł losowości. Pola Primes i Precomputed struktury PrivateKey są teraz używane i walidowane nawet gdy niektóre wartości są brakujące. Wprowadzono także zmiany w crypto/x509 w zakresie analizy i wyodrębniania kluczy RSA, opisano to poniżej.

SignPKCS1v15 i VerifyPKCS1v15 teraz obsługują SHA-512/224, SHA-512/256 i SHA-3.

GenerateKey teraz używa nieco innej metody do generowania prywatnej eksponenty (funkcja Carmichaela zamiast funkcji Eulera). Rzadkie aplikacje, które na zewnątrz przetwarzają klucze tylko z liczb pierwszych, mogą generować różne, ale kompatybilne wyniki.

Operacje na kluczach publicznych i prywatnych są teraz do dwóch razy szybsze na wasm.

crypto/sha*

crypto/subtle

Nowa funkcja WithDataIndependentTiming umożliwia użytkownikowi wykonanie funkcji z włączonymi funkcjami specyficznymi dla architektury, które gwarantują niezmienność określonych instrukcji względem czasu wartości danych. Może być używane, aby upewnić się, że kod stworzony do pracy w stałym czasie nie został zoptymalizowany funkcjami poziomu procesora w taki sposób, że działa w zmiennym czasie. W tej chwili WithDataIndependentTiming używa bitu PSTATE.DIT na arm64 i nic nie robi na wszystkich innych architekturach. Konfiguracja GODEBUG dataindependenttiming=1 włącza tryb DIT dla całego programu Go.

Wnioski XORBytes musi w pełni pokrywać się lub nie w ogóle z wejściem. Wcześniejsze zachowanie było nieokreślone w przeciwnym razie, podczas gdy teraz XORBytes będzie panikować.

crypto/tls

Serwer TLS teraz obsługuje Encrypted Client Hello (ECH). Ta funkcjonalność może być włączona poprzez wypełnienie pola Config.EncryptedClientHelloKeys.

Nowy postkwantowy mechanizm wymiany kluczy X25519MLKEM768 jest teraz obsługiwany i włączony domyślnie, gdy Config.CurvePreferences jest nil. Konfiguracja GODEBUG tlsmlkem=0 zwraca wartości domyślne.

Wsparcie dla eksperymentalnej wymiany klucza X25519Kyber768Draft00 zostało usunięte.

Kolejność wymiany klucza jest teraz całkowicie obsługiwana przez pakiet crypto/tls. Kolejność Config.CurvePreferences jest teraz ignorowana, a zawartość używana wyłącznie do określenia, które wymiany klucza włączyć, gdy pole jest wypełnione.

Nowe pole ClientHelloInfo.Extensions wylicza listę identyfikatorów rozszerzeń otrzymanych w wiadomości Client Hello. Może to być przydatne do śledzenia odcisków klientów TLS.

crypto/x509

Konfiguracja GODEBUG x509sha1 zostało usunięte. Certficicate.Verify nie obsługuje już podpisów opartych na SHA-1.

OID teraz implementuje interfejsy encoding.BinaryAppender i encoding.TextAppender.

Domyślne pole polityk certyfikatów zostało zmienione z Certificate.PolicyIdentifiers na Certificate.Policies. Podczas analizy certyfikatów oba pola będą wypełnione, ale przy tworzeniu polityk certyfikatów zostaną wzięte z pola Certificate.Policies zamiast Certificate.PolicyIdentifiers. Ta zmiana może być przywrócona ustawieniem GODEBUG x509usepolicies=0.

CreateCertificate teraz będzie generować numer seryjny używając metody zgodnej z RFC 5280, przy przekazywaniu wzoru przez pole Certificate.SerialNumber nil, zamiast wysypania błędu.

Certificate.Verify teraz obsługuje walidację polityki, jak określono w RFC 5280 i RFC 9618. Nowe pole VerifyOptions.CertificatePolicies może być ustawione na akceptowalny zestaw polityk OIDs. Tylko łańcuchy certyfikatów z ważnymi politykami będą zwracane z Certificate.Verify.

MarshalPKCS8PrivateKey teraz zwraca błąd zamiast wydobywać niewłaściwy klucz RSA. (MarshalPKCS1PrivateKey nie ma zwracania błędów, a jego zachowanie w przypadku nieprawidłowych kluczy pozostaje nieokreślone.)

ParsePKCS1PrivateKey i ParsePKCS8PrivateKey teraz używają i walidują zakodowane wartości CRT, dlatego mogą odrzucać niewłaściwe klucze RSA, które wcześniej były akceptowane. Użycie ustawienia GODEBUG x509rsacrt=0 przywraca do przeliczania wartości CRT.

debug/elf

Pakiet debug/elf dodaje wsparcie dla obsługi wersji symboli w dynamicznych plikach ELF (Executable and Linkable Format). Nowa metoda File.DynamicVersions zwraca listę dynamicznych wersji zdefiniowanych w pliku ELF. Nowa metoda File.DynamicVersionNeeds zwraca listę dynamicznych wersji wymaganych przez ten plik ELF, które są zdefiniowane w innych obiektach ELF. W końcu nowe pola Symbol.HasVersion i Symbol.VersionIndex określają wersję symbolu.

encoding

Dwa nowe interfejsy TextAppender i BinaryAppender zostały wprowadzone do dodawania tekstowej lub binarnej reprezentacji obiektu do dynamicznej tablicy bajtów. Te interfejsy oferują tę samą funkcjonalność co TextMarshaler i BinaryMarshaler, ale zamiast przydzielać nową tablicę za każdym razem, dodają dane bezpośrednio do istniejącej tablicy. Te interfejsy są teraz realizowane przez typy standardowej biblioteki, które już implementują TextMarshaler i/lub BinaryMarshaler.

encoding/json

Podczas budowania pole struktury z nową opcją omitzero w tagu pola struktury zostanie pominięte, jeśli jego wartość wynosi zero. Jeśli typ pola ma metodę IsZero() bool, zostanie ona użyta do określenia, czy wartość jest zerowa. W przeciwnym razie wartość będzie zerowa, jeśli jest wartością zerową dla jego typu. Tag pola omitzero jest czystszy i mniej podatny na błędy niż omitempty, gdy intencją jest pominięcie zerowych wartości. W szczególności, w przeciwieństwie do omitempty, omitzero pomija zerowe time.Time wartości, co jest częstym źródłem problemów.

Jeśli określono zarówno omitempty, jak i omitzero, pole zostanie pominięte, jeśli wartość jest pusta lub zerowa (lub oba razem).

UnmarshalTypeError.Field teraz zawiera wbudowane struktury w celu dostarczenia bardziej szczegółowych komunikatów o błędach.

go/types

Wszystkie struktury danych go/types, które ujawniają sekwencje par metod, takich jak Len() int i At(int) T, mają teraz również metody, które zwracają iteratory, co umożliwia uproszczenie kodu podobnego do tego:

params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }

Na to:

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/*

log/slog

Nowy DiscardHandler jest handlerem, który nigdy nie jest włączany i zawsze odrzuca swoje wyjście.

Poziom i LevelVar teraz realizują interfejs encoding.TextAppender.

math/*

net

ListenCondig teraz używa MPTCP domyślnie na systemach, gdzie jest to wspierane (na razie tylko Linux).

IP teraz realizuje interfejs encoding.TextAppender.

net/http

Zmieniło się ograniczenie Transport na uzyskane odpowiedzi informacyjne 1xx w odpowiedzi na żądanie. Wcześniej zatrzymywało to żądanie i zwracało błąd po otrzymaniu więcej niż 5 odpowiedzi 1xx. Teraz zwraca błąd tylko wtedy, gdy całkowity rozmiar wszystkich odpowiedzi 1xx przekracza ustawienie konfiguracyjne Transport.MaxResponseHeaderBytes.

Ponadto, gdy żądanie ma hak do śledzenia net/http/httptrace.ClientTrace.Got1xxResponse, teraz nie ma ograniczenia na ogólną liczbę odpowiedzi 1xx. Hak Got1xxResponse może zwrócić błąd w celu zatrzymania żądania.

Transport i Serwer teraz mają pole HTTP2, które pozwala na konfigurację ustawień protokołu HTTP/2.

Nowe pola Server.Protocols i Transport.Protocols zapewniają prosty sposób na skonfigurowanie, jakie protokoły HTTP serwer lub klient używają.

Serwer i klient mogą być skonfigurowani do obsługi niezabezpieczonych połączeń HTTP/2.

Kiedy Server.Protocols zawiera UnencrypterHTTP2, serwer przyjmie połączenia HTTP/2 na niezabezpieczone porty. Serwer może przyjąć zarówno HTTP/1, jak i niezabezpieczony HTTP/2 na tym samym porcie.

Kiedy Transport.Protocols zawiera UnencryptedHTTP2 i nie zawiera HTTP1, transport użyje niezabezpieczonego HTTP/2 dla adresów http://. Jeżeli transport jest skonfigurowany do używania zarówno HTTP/1, jak i niezaszyfrowanego HTTP/2, będzie korzystał z HTTP/1.

Wsparcie dla niezaszyfrowanego HTTP/2 korzysta z „HTTP/2 z wstępnym poświadczeniem” (RFC 9113, sekcja 3.3). Przestarzały nagłówek „Upgrade: h2c” nie jest wspierany.

net/netip

Adres, AdresPort i Prefiks teraz implementuje interfejsy encoding.BinaryAppender i encoding.TextAppender.

net/url

URL teraz również implementuje interfejs encoding.BinaryAppender.

os/user

W systemie Windows Aktualny może być teraz używany w Windows Nano Server. Implementacja została zaktualizowana, aby uniknąć korzystania z funkcji z biblioteki NetApi32, która jest niedostępna w Nano Server.

W systemie Windows Aktualny, Lookup i LookupId teraz wspierają następujące wbudowane konta serwisowe użytkownika:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

W systemie Windows Aktualny został znacznie przyspieszony, gdy bieżący użytkownik jest podłączony do wolnej domeny, co jest częstym przypadkiem dla wielu użytkowników korporacyjnych. Nowa wydajność implementacji teraz wynosi kilka milisekund, w porównaniu do wcześniejszej implementacji, która mogła zająć kilka sekund, a nawet minut, do zakończenia.

W systemie Windows Aktualny teraz zwraca użytkownika będącego właścicielem procesu, gdy bieżący wątek udaje się za innego użytkownika. Wcześniej zwracało to błąd.

regexp

Regexp teraz realizuje interfejs encoding.TextAdapter.

runtime

veth_xdp_flush_bq() GOROOT został teraz uznany za przestarzały. W nowym kodzie należy preferować użycie ścieżki systemowej do określenia pliku binarnego 'go', oraz używać go env GOROOT do określenia GOROOT.

strings

Pakiet strings dodaje kilka funkcji do pracy z iteratorami:

  • Lines zwraca iterator po wierszach rozdzielonych nowymi liniami w ciągu.
  • SplitSeq zwraca iterator po wszystkich podciągach ciągu, rozdzielonych separatorem.
  • SplitAfterSeq zwraca iterator po podciągach ciągu, oddzielonych po każdym wystąpieniu separatora.
  • FieldsSeq zwraca iterator po podciągach ciągu wokół sekwencji znaków białych, tak jak zdefiniowano.unicode.IsSpace
  • FieldsFuncSeq zwraca iterator po podciągach ciągu wokół sekwencji punktów kodowych unicode, które spełniają predykat.

sync

Realizacja sync.Map został zmieniony, poprawiając wydajność, szczególnie dla zmian w słownikach. Na przykład, jest mniej prawdopodobne, że nastąpi współzawodnictwo zmian w nieprzeciętnych zestawach na dużych słownikach, a czas na przyrost do osiągnięcia niskiego współzawodnictwa w słowniku nie jest już wymagany.

Jeśli napotkasz jakiekolwiek problemy, ustaw GOEXPERIMENT=nosynchashtriemap podczas budowy, aby wrócić do starej implementacji, i proszę, wypełnij formularz zgłoszenia problemu.

testing

Nowe metody T.Context i B.Context zwracają kontekst, który jest anulowany po zakończeniu testu i przed wykonaniem funkcji czyszczących test.

Nowe metody T.Chdir i B.Chdir mogą być używane do zmiany katalogu roboczego w czasie trwania testu lub benchmarku.

text/template

Szablony teraz wspierają range-over-func oraz range-over-int.

time

Czas teraz implementuje interfejsy encoding.BinaryAppender i encoding.TextAppender.

Porty

Linuxa

Jak było ogłoszono w notatkach z wersji Go 1.23, Go 1.24 wymaga jądra Linux w wersji 3.2 lub nowszej.

Darwin

Go 1.24 jest ostatnią wersją, która będzie działać na macOS 11 Big Sur. Go 1.25 będzie wymagać macOS 12 Monterey lub nowszej.

WebAssembly

Dyrektywa kompilatora go:wasmexport została dodana do programów Go w celu eksportowania funkcji do hosta WebAssembly.

W interfejsie systemu WebAssembly Preview 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 wspiera budowanie programu Go jako reactor/library poprzez wskazanie flagi kompilacji -buildmode=c-shared.

Więcej typów teraz dopuszczonych jako typ argumentu lub wyniku dla funkcji go:wasmimport. W szczególności, bool, string, uintptr i wskaźniki do określonych typów są dozwolone (szczegóły można zobaczyć w dokumentacji), razem z typami całkowitymi 32-bitowymi i 64-bitowymi oraz zmiennoprzecinkowymi, a także unsafe.Pointer, które były już dozwolone. Te typy są również dozwolone jako typy argumentu lub wyniku dla funkcji go:wasmexport.

Pliki wsparcia dla WebAssembly zostały przeniesione do lib/wasm z misc/wasm.

Początkowy rozmiar pamięci został znacznie zmniejszony, szczególnie dla małych aplikacji WebAssembly.

Windows

32-bitowy port windows/arm (GOOS=windows GOARCH=arm) został oznaczony jako uszkodzony. Szczegóły w #70705

Źródło: linux.org.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster