---
id: 149c0672eec2caba57477612564e9368
author: Lemon Mint
title: 'Przegląd wydania Go 1.24: mapy Swiss Table, ML-KEM, os.Root i testing/synctest'
description: 'Przegląd techniczny Go 1.24: wbudowane mapy oparte na Swiss Table, crypto/mlkem (FIPS 203), TLS Encrypted Client Hello, runtime.AddCleanup, os.Root oraz testing/synctest.'
language: pl
date: 2024-12-20T00:23:21.60729Z
path: /blog/posts/whats-new-in-go-1-24-z83ff24d2
category: release
---

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.

![Przegląd Go 1.24](/assets/images/whats-new-in-go1.24/overview.webp)
