- Version Go 1.22 wurde sechs Monate nach Go 1.21 veröffentlicht.
- Die meisten Änderungen betreffen die Implementierung der Toolchain, der Runtime und der Bibliotheken.
- Das Go-1-Kompatibilitätsversprechen bleibt bestehen, und es wird erwartet, dass sich fast alle Go-Programme wie bisher kompilieren und ausführen lassen.
Sprachänderungen
- Es gibt zwei Änderungen an
for-Schleifen.
- Zuvor wurden von einer
for-Schleife deklarierte Variablen einmal erzeugt und bei jeder Iteration aktualisiert; in Go 1.22 erzeugt nun jede Iteration der Schleife eine neue Variable, um Bugs durch versehentliches Teilen zu verhindern.
for-Schleifen können jetzt über Ganzzahlen iterieren.
Werkzeuge
Go-Befehl
- In Workspaces können Abhängigkeiten mit dem Verzeichnis
vendor verwaltet werden.
go get wird im älteren GOPATH-Modus ohne Module nicht mehr unterstützt.
go mod init versucht nun nicht mehr, Modulanforderungen aus Konfigurationsdateien anderer Vendoring-Tools zu importieren.
go test -cover gibt jetzt auch für Pakete ohne eigene Testdateien eine Coverage-Zusammenfassung aus.
Trace
- Die Web-UI des Tools
trace wurde teilweise neu gestaltet, um den neuen Tracer zu unterstützen.
Vet
- Das Verhalten des Tools
vet für Schleifenvariablen wurde geändert.
- Eine neue Warnung wurde für Aufrufe ergänzt, bei denen
append keine Werte hinzugefügt werden.
- Eine neue Warnung wurde für Probleme ergänzt, die bei der Verwendung von
time.Since in einer defer-Anweisung auftreten.
- Eine neue Warnung wurde ergänzt, wenn in
log/slog-Aufrufen Schlüssel-Wert-Paare nicht zusammenpassen.
Runtime
- CPU-Leistung wird um 1–3 % verbessert, indem typbasierte Garbage-Collection-Metadaten näher an Heap-Objekten gehalten werden.
Compiler
- Builds mit Profile-Guided Optimization (PGO) können jetzt mehr Aufrufe als bisher devirtualisieren.
Linker
- Die Flags
-s und -w des Linkers wurden so geändert, dass sie sich auf allen Plattformen konsistenter verhalten.
Bootstrap
- Go 1.22 erfordert zum Bootstrapping mindestens das letzte Point-Release von Go 1.20 oder neuer.
Kernbibliothek
Neues Paket math/rand/v2
math/rand/v2 ist das erste „v2“-Paket der Standardbibliothek und bringt im Vergleich zu math/rand mehrere wichtige Änderungen mit.
Neues Paket go/version
- Hinzugefügt wurde das neue Paket
go/version, das Funktionen zur Validierung und zum Vergleich von Go-Versionsstrings implementiert.
Verbesserte Routing-Patterns
- Das HTTP-Routing der Standardbibliothek wurde ausdrucksstärker gemacht.
Kleinere Änderungen in Bibliotheken
- Es gibt kleinere Änderungen und Performance-Verbesserungen in verschiedenen Bibliotheken.
Ports
Darwin
- Unter macOS erzeugt die Go-Toolchain für die 64-Bit-x86-Architektur (
darwin/amd64-Port) jetzt standardmäßig position-unabhängige Executables (PIE).
Arm
- Mit der Umgebungsvariable
GOARM kann zwischen Software- und Hardware-Gleitkomma gewählt werden.
Loong64
- Der Port
loong64 übergibt Funktionsargumente und -ergebnisse jetzt über Register.
OpenBSD
- Für OpenBSD wurde ein experimenteller Port für Big-Endian-64-Bit-PowerPC (
openbsd/ppc64) hinzugefügt.
Meinung von GN⁺
- Besonders bemerkenswert an diesem Release von Go 1.22 sind die Änderungen an
for-Schleifen und die Einführung des neuen Pakets math/rand/v2. Diese Änderungen bieten Go-Entwicklern bessere Performance und mehr Stabilität und spiegeln die Weiterentwicklung der Sprache Go wider.
- Das Paket
math/rand/v2 bietet mit schnelleren Algorithmen und einer neuen API bessere Funktionen zur Zufallszahlengenerierung, was für Kryptografie und andere von Zufallszahlen abhängige Anwendungen eine wichtige Verbesserung darstellt.
- Es wird erwartet, dass Go 1.22 positive Auswirkungen auf die Go-Community haben wird, da es bei gleichbleibender Kompatibilität vielfältige Optimierungen und neue Funktionen zur Verbesserung von Performance und Developer Experience bereitstellt.
1 Kommentare
Hacker-News-Kommentare
io.Copykann nun beim Kopieren vonTCPConnnachUnixConnden Linux-Systemaufrufsplice(2)verwenden. Die dadurch möglichen Vorteile dieses Musters imio-Paket werden sehr geschätzt.httpmuxgo121steuern.sql.Null[T]wird begrüßt. Bisher wurdenullvonsqlboilerverwendet; es hat eine ähnliche API wiesql.Null, bietet zusätzlich aber die MethodeIsSet() bool, die anzeigt, ob ein Wert explizit gesetzt wurde.chientfernen lässt.anyausgetauscht.