Przegląd wydania Go 1.24: mapy Swiss Table, ML-KEM, os.Root i testing/synctest

Go 1.24 zapowiada się jako znaczące wydanie, wprowadzające szereg usprawnień skupionych na wydajności, bezpieczeństwie i doświadczeniu deweloperów. Zmiany te mają na celu uczynienie Go jeszcze bardziej wydajnym i efektywnym przy tworzeniu nowoczesnych aplikacji.
Zwiększenie wydajności
Ogólna poprawa wydajności, polegająca na redukcji narzutu procesora o 2-3% w zestawie reprezentatywnych testów wydajnościowych. Ulepszenia obejmują nową wbudowaną implementację mapy, bardziej wydajną alokację pamięci dla małych obiektów oraz nową wewnętrzną implementację muteksu w środowisku uruchomieniowym. Wyniki mogą się różnić w zależności od aplikacji.
Kryptografia postkwantowa
Wprowadzenie pakietu crypto/mlkem, implementującego ML-KEM-768 i ML-KEM-1024. ML-KEM to postkwantowy mechanizm wymiany kluczy, wcześniej znany jako Kyber i określony w standardzie FIPS 203. Ten dodatek przygotowuje Go na przyszłość bezpieczeństwa kryptograficznego.
Usprawnienia TLS
Wsparcie dla Encrypted Client Hello (ECH) w TLS. Funkcję tę można włączyć, wypełniając pole Config.EncryptedClientHelloKeys, co zwiększa prywatność i bezpieczeństwo połączeń TLS.
Nowa mapa Swiss Table
Ulepszona implementacja mapy zapewniająca lepszą wydajność. Nowa implementacja oparta jest na Swiss Tables i może zostać wyłączona za pomocą flagi kompilacji GOEXPERIMENT=noswissmap.
Aktualizacja sync.Map
Poprawiona wydajność modyfikacji mapy w sync.Map. Modyfikacje rozłącznych zbiorów kluczy znacznie rzadziej powodują rywalizację o dostęp w większych mapach, a odczyty z mapy nie wymagają już fazy rozgrzewania, aby osiągnąć niską rywalizację. W przypadku problemów można powrócić do poprzedniej implementacji, używając GOEXPERIMENT=nosynchashtriemap.
Ulepszone kodowanie JSON
Nowa opcja znacznika omitempty umożliwiająca inteligentniejsze pomijanie pól struktur podczas serializacji JSON. Podczas serializacji pole struktury z opcją omitempty zostanie pominięte, jeśli jego wartość jest zerowa. Jeśli typ pola posiada metodę IsZero() bool, zostanie ona użyta do określenia, czy wartość jest zerowa.
Czyszczenie w środowisku uruchomieniowym
Wprowadzenie funkcji AddCleanup, zastępującej SetFinalizer w celu lepszego zarządzania zasobami. W przeciwieństwie do SetFinalizer, nie przywraca ona obiektu, do którego jest dołączona, w celu jego finalizacji, a do jednego obiektu można dołączyć wiele funkcji czyszczących. Nowy kod powinien preferować AddCleanup zamiast SetFinalizer.
Dyrektywy narzędzi w go.mod
Ulepszone śledzenie zależności wykonywalnych za pomocą dyrektyw narzędzi w go.mod. Eliminuje to potrzebę stosowania dotychczasowego obejścia, polegającego na dodawaniu narzędzi jako importów pustych (blank imports) do pliku konwencjonalnie nazywanego „tools.go”.
Dostęp ograniczony do katalogu
Nowy typ os.Root do kontrolowanych operacji na systemie plików. Typ os.Root umożliwia wykonywanie operacji na systemie plików w obrębie określonego katalogu, uniemożliwiając dostęp poza wskazaną ścieżkę.
Usprawnienia testowania
Nowy pakiet testing/synctest do testowania kodu współbieżnego. Funkcja synctest.Run uruchamia grupę gorutyn w izolowanej „bańce”, a funkcja synctest.Wait czeka, aż wszystkie gorutyny w bieżącej bańce zostaną zablokowane. Pakiet ten jest eksperymentalny i musi zostać włączony poprzez ustawienie GOEXPERIMENT=synctest podczas kompilacji.
Pamięć podręczna budowania
Pliki wykonywalne uruchamiane poleceniem go run są teraz buforowane, co przyspiesza ich wielokrotne wykonywanie. Kosztem tego rozwiązania jest większy rozmiar pamięci podręcznej.
Wydajność Cgo
Nowe adnotacje #cgo noescape i #cgo nocallback zwiększające wydajność Cgo. #cgo noescape cFunctionName informuje kompilator, że pamięć przekazywana do funkcji C nie ucieka (nie jest udostępniana poza wywołanie). #cgo nocallback cFunctionName informuje kompilator, że funkcja C nie wywołuje żadnych funkcji Go.
Słabe wskaźniki
Wsparcie dla słabych wskaźników (weak pointers), umożliwiających bezpieczne odwoływanie się do pamięci bez uniemożliwiania jej zwolnienia. Słabe wskaźniki są prymitywem niskiego poziomu, zapewniającym tworzenie oszczędnych pod względem pamięci struktur, takich jak słabe mapy do kojarzenia wartości, mapy kanonikalizacji oraz różnego rodzaju pamięci podręczne.
Usprawnienie benchmarków
Nowa metoda testing.B.Loop zapewniająca szybsze i mniej podatne na błędy benchmarki. Funkcja benchmarku zostanie wykonana dokładnie raz na każdą wartość -count, dzięki czemu kosztowne kroki przygotowania i czyszczenia są wykonywane tylko raz. Parametry wywołań funkcji oraz ich wyniki są utrzymywane przy życiu, co uniemożliwia kompilatorowi całkowitą optymalizację ciała pętli.
Go 1.24 zapowiada się jako znaczące wydanie, oferujące istotne usprawnienia w różnych aspektach języka i jego ekosystemu.
