Die wichtigsten Verbesserungen in Go 1.24
(gosuda.org)Go 1.24 scheint ein wichtiges Release zu werden und führt zahlreiche Verbesserungen mit Fokus auf Performance, Sicherheit und Developer Experience ein. Diese Änderungen sollen Go beim Erstellen moderner Anwendungen noch leistungsfähiger und effizienter machen.
Performance-Verbesserungen
In einer repräsentativen Benchmark-Suite gab es allgemeine Performance-Verbesserungen, die den CPU-Overhead um 2–3 % senken. Zu diesen Verbesserungen gehören eine neue eingebaute map-Implementierung, eine effizientere Speicherallokation für kleine Objekte und eine neue interne Mutex-Implementierung der Runtime. Die Ergebnisse können je nach Anwendung variieren.
Quantenresistente Kryptografie
Das Paket crypto/mlkem, das ML-KEM-768 und ML-KEM-1024 implementiert, wurde eingeführt. ML-KEM, früher unter dem Namen Kyber bekannt, ist ein in FIPS 203 spezifizierter quantenresistenter Schlüsselaustauschmechanismus. Diese Ergänzung macht Go fit für künftige kryptografische Sicherheitsanforderungen.
Encrypted Client Hello
ECH (Encrypted Client Hello) wird in TLS unterstützt. Diese Funktion kann aktiviert werden, indem das Feld Config.EncryptedClientHelloKeys befüllt wird, und verbessert Datenschutz und Sicherheit von TLS-Verbindungen.
Neue Swiss-Table-Map
Eine verbesserte map-Implementierung für bessere Performance. Diese neue Implementierung basiert auf Swiss Tables und kann mit dem Build-Flag GOEXPERIMENT=noswissmap deaktiviert werden.
Sync-Map-Update
Die Performance von Änderungen an sync.Map wurde verbessert. Änderungen an getrennten Key-Sets geraten bei größeren Maps deutlich seltener in Konkurrenz, und die Vorbereitungszeit, die bisher nötig war, um eine geringe Contention-Last auf der Map zu erreichen, entfällt nun. Falls Probleme auftreten, kann mit GOEXPERIMENT=nosynchashtriemap auf die vorherige Implementierung zurückgewechselt werden.
Verbesserte JSON-Marshalling-Funktion
Eine neue Tag-Option omitempty für intelligenteres Weglassen von Struct-Feldern beim JSON-Marshalling. Wenn beim Marshallen der Wert eines Struct-Felds mit der Option omitempty 0 ist, wird es ausgelassen. Falls der Feldtyp eine Methode IsZero() bool hat, wird diese verwendet, um zu prüfen, ob der Wert 0 ist.
Runtime-Bereinigung
Die Funktion AddCleanup wurde eingeführt und ersetzt SetFinalizer für besseres Ressourcenmanagement. Anders als SetFinalizer belebt sie keine mit der Finalisierung verknüpften Objekte wieder und erlaubt es, mehrere Cleanup-Operationen an ein einzelnes Objekt zu hängen. Neuer Code sollte AddCleanup gegenüber SetFinalizer bevorzugen.
Tool-Direktive in go.mod
Die Nachverfolgung von Tool-Abhängigkeiten wurde durch die Tool-Direktive in go.mod verbessert. Dadurch entfällt der bisherige Workaround, Tools per Blank Import in eine Datei mit dem konventionellen Namen tools.go aufzunehmen.
Verzeichnisbeschränkter Zugriff
Der neue Typ os.Root für kontrollierte Dateisystemoperationen. Der Typ os.Root ermöglicht Dateisystemzugriffe innerhalb eines bestimmten Verzeichnisses und verhindert damit den Zugriff außerhalb des angegebenen Pfads.
Test-Verbesserungen
Das neue Paket testing/synctest dient zum Testen nebenläufigen Codes. Die Funktion synctest.Run startet eine Gruppe von Goroutines in einer isolierten „Bubble“, und synctest.Wait wartet, bis alle Goroutines in der aktuellen Bubble blockiert sind. Das Paket ist experimentell und muss beim Build mit GOEXPERIMENT=synctest aktiviert werden.
Build-Cache
Ausführbare Dateien von go run werden jetzt für schnellere Ausführung zwischengespeichert. Dadurch wird der Cache zwar größer, wiederholte Ausführungen laufen aber schneller.
Cgo-Performance
Neue Annotationen #cgo noescape und #cgo nocallback für bessere Cgo-Performance. #cgo noescape cFunctionName teilt dem Compiler mit, dass an die C-Funktion übergebener Speicher nicht escapt. #cgo nocallback cFunctionName teilt dem Compiler mit, dass die C-Funktion keine Go-Funktion zurück aufruft.
Schwache Pointer
Unterstützung für schwache Pointer, um Speicher sicher zu referenzieren, ohne die Freigabe zu verhindern. Schwache Pointer sind als Low-Level-Baustein gedacht, um speichereffiziente Strukturen wie schwache Maps für Value Associations, Interning-Maps und verschiedene Arten von Caches zu erstellen.
Verbesserungen bei Benchmark-Tests
Die neue Methode testing.B.Loop ermöglicht schnellere und weniger fehleranfällige Benchmarks. Benchmark-Funktionen werden pro -count genau einmal ausgeführt, sodass teure Setup- und Cleanup-Schritte nur einmal laufen. Funktionsaufrufparameter und Ergebnisse bleiben erhalten, sodass der Compiler den Loop-Body nicht vollständig wegoptimieren kann.
Go 1.24 scheint ein wichtiges Release zu werden und bringt erhebliche Verbesserungen in verschiedenen Bereichen der Sprache und ihres Ökosystems.
4 Kommentare
Gibt es für diejenigen unter euch, die Go verwenden, irgendwelche Funktionen, die ihr euch wünscht?
Ich persönlich fände Operatoren wie
.?und??gut, und wenn möglich hätte ich auch gern Makros.Ehrlich gesagt sind Struct-Tags ein Fehler.
Ich persönlich wünschte mir auch wirklich, es gäbe Makros. Wie lange soll man denn noch
generateausführen? seufzIch würde gern verstehen, warum
struct tagals Fehler gilt.Das größte Problem ist, dass man nur schwer Unterstützung durch Tools bekommt.
gomodifytagsgibt es auch schon lange, aber die Integration in die Go-Erweiterung von VSC kam ebenfalls ziemlich spät.