Go 1.24 Release Overview: Swiss-Table-Maps, ML-KEM, os.Root und testing/synctest

Go 1.24 entwickelt sich zu einer bedeutenden Version, die eine Reihe von Verbesserungen in den Bereichen Leistung, Sicherheit und Entwicklererfahrung einführt. Diese Änderungen zielen darauf ab, Go noch leistungsfähiger und effizienter für die Entwicklung moderner Anwendungen zu machen.
Leistungssteigerung
Eine allgemeine Leistungsverbesserung mit einer Reduzierung des CPU-Mehraufwands um 2 bis 3 % über eine Reihe repräsentativer Benchmarks. Zu diesen Verbesserungen gehören eine neue integrierte Map-Implementierung, eine effizientere Speicherzuweisung für kleine Objekte sowie eine neue, laufzeitinterne Mutex-Implementierung. Die Ergebnisse können je nach Anwendung variieren.
Post-Quanten-Kryptografie
Einführung des Pakets crypto/mlkem, das ML-KEM-768 und ML-KEM-1024 implementiert. ML-KEM ist ein Post-Quanten-Schlüsselaustauschverfahren, das früher als Kyber bekannt war und in FIPS 203 spezifiziert ist. Diese Ergänzung bereitet Go auf die Zukunft der kryptografischen Sicherheit vor.
TLS-Erweiterung
Unterstützung für Encrypted Client Hello (ECH) in TLS. Diese Funktion kann durch Setzen des Feldes Config.EncryptedClientHelloKeys aktiviert werden und verbessert die Privatsphäre und Sicherheit von TLS-Verbindungen.
Neue Swiss-Table-Map
Eine verbesserte Map-Implementierung für bessere Leistung. Diese neue Implementierung basiert auf Swiss Tables und kann mit dem Build-Flag GOEXPERIMENT=noswissmap deaktiviert werden.
Aktualisierung von sync.Map
Verbesserte Leistung bei Map-Änderungen in sync.Map. Änderungen an disjunkten Schlüsselmengen führen bei größeren Maps deutlich seltener zu Konflikten, und es ist nicht mehr eine Anlaufzeit erforderlich, um eine konfliktarme Lastverteilung aus der Map zu erreichen. Bei Problemen kann mithilfe von GOEXPERIMENT=nosynchashtriemap auf die alte Implementierung zurückgewechselt werden.
Erweitertes JSON-Marshaling
Eine neue Tag-Option omitempty zur intelligenteren Auslassung von Struct-Feldern beim JSON-Marshaling. Beim Marshaling wird ein Struct-Feld mit der Option omitempty ausgelassen, wenn sein Wert null ist. Besitzt der Feldtyp eine Methode IsZero() bool, wird diese verwendet, um zu bestimmen, ob der Wert null ist.
Laufzeit-Bereinigung
Einführung der Funktion AddCleanup als Ersatz für SetFinalizer zur besseren Ressourcenverwaltung. Anders als SetFinalizer belebt sie das Objekt, an das sie angehängt ist, zur Finalisierung nicht wieder, und einem einzelnen Objekt können mehrere Bereinigungsfunktionen zugeordnet werden. Neuer Code sollte AddCleanup gegenüber SetFinalizer bevorzugen.
Tool-Direktiven in go.mod
Verbesserte Verfolgung ausführbarer Abhängigkeiten mithilfe von Tool-Direktiven in go.mod. Dadurch entfällt die bisherige Umgehungslösung, Tools als Blank-Imports in einer üblicherweise „tools.go“ genannten Datei einzubinden.
Auf Verzeichnisse beschränkter Zugriff
Neuer Typ os.Root für kontrollierte Dateisystemoperationen. Der Typ os.Root ermöglicht es, Dateisystemoperationen innerhalb eines bestimmten Verzeichnisses auszuführen und verhindert so den Zugriff außerhalb des angegebenen Pfads.
Verbesserungen beim Testen
Neues Paket testing/synctest zum Testen von nebenläufigem Code. Die Funktion synctest.Run startet eine Gruppe von Goroutinen in einer isolierten „Blase“, und die Funktion synctest.Wait wartet, bis alle Goroutinen in der aktuellen Blase blockiert sind. Dieses Paket ist experimentell und muss zur Build-Zeit durch Setzen von GOEXPERIMENT=synctest aktiviert werden.
Build-Cache
Ausführbare Dateien von go run werden nun zwischengespeichert, um die Ausführung zu beschleunigen. Dadurch werden wiederholte Ausführungen schneller, auf Kosten eines größeren Caches.
Cgo-Leistung
Neue Annotationen #cgo noescape und #cgo nocallback für eine bessere Cgo-Leistung. #cgo noescape cFunctionName teilt dem Compiler mit, dass der an die C-Funktion übergebene Speicher nicht entweicht. #cgo nocallback cFunctionName teilt dem Compiler mit, dass die C-Funktion keine Go-Funktionen zurückruft.
Schwache Zeiger
Unterstützung für schwache Zeiger, um Speicher sicher zu referenzieren, ohne dessen Freigabe zu verhindern. Schwache Zeiger sind ein Primitiv niedriger Ebene, das die Erstellung speichereffizienter Strukturen ermöglichen soll, etwa schwache Maps zur Zuordnung von Werten, Maps zur Kanonikalisierung und verschiedene Arten von Caches.
Verbesserung von Benchmarks
Neue Methode testing.B.Loop für schnellere und weniger fehleranfällige Benchmarks. Die Benchmark-Funktion wird pro -count genau einmal ausgeführt, sodass aufwendige Setup- und Bereinigungsschritte nur einmal ausgeführt werden. Parameter und Ergebnisse von Funktionsaufrufen bleiben am Leben, wodurch verhindert wird, dass der Compiler den Schleifenkörper vollständig wegoptimiert.
Go 1.24 entwickelt sich zu einer bedeutenden Version, die substanzielle Verbesserungen in verschiedenen Aspekten der Sprache und ihres Ökosystems bietet.
