3 Punkte von lemonmint 2024-12-20 | 4 Kommentare | Auf WhatsApp teilen

[IMG] Overview of Go 1.24

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

 
secret3056 2024-12-20

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.

 
gkswnsqja 2024-12-20

Ich persönlich wünschte mir auch wirklich, es gäbe Makros. Wie lange soll man denn noch generate ausführen? seufz

 
qkrqjadn 2024-12-20

Ich würde gern verstehen, warum struct tag als Fehler gilt.

 
secret3056 2024-12-20

Das größte Problem ist, dass man nur schwer Unterstützung durch Tools bekommt.

  • Da es sich um Strings handelt, sind Tippfehler schwer zu finden.
  • Außer bei JSON gibt es keine Autovervollständigung oder IntelliSense.
  • Wenn man mehrere Tools verwendet, muss man alles in eine einzige Zeile schreiben, und der Eindruck leidet zwangsläufig unter der schlechten Lesbarkeit.

gomodifytags gibt es auch schon lange, aber die Integration in die Go-Erweiterung von VSC kam ebenfalls ziemlich spät.