1 Punkte von GN⁺ 2024-02-08 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-02-08
Hacker-News-Kommentare
  • Ein TypeScript-Entwickler berichtet von seinem jüngsten Wechsel zur Sprache Go. Anfangs äußerte er Bedenken wegen des Mangels an Array-Funktionen in Go und des wenig flexiblen Typsystems. Beim Arbeiten mit Go erkannte er jedoch die Vorzüge der hervorragenden Standardbibliothek, der Typsicherheit und der eingebauten Coding-Standards. Auch dass Routing in die Standardbibliothek integriert wurde, bewertet er positiv.
  • Es wurde ein Link zu interaktiven Release Notes für Go 1.22 geteilt.
  • Ein Entwickler, der Go seit mehr als 9 Jahren nutzt, vergleicht Dart (für Flutter-Entwicklung) mit Go. Dart versucht, möglichst jede Funktion hinzuzufügen, während Go umgekehrt Einfachheit anstrebt. In Dart führen die vielen Möglichkeiten zur Initialisierung von Klassen zu Verwirrung, und er vermisst die Einfachheit von Go. Komplexe Einzelausdrücke mit Maps/Streams usw. in Dart können beim Debuggen oder für Einsteiger verwirrend sein.
  • io.Copy kann nun beim Kopieren von TCPConn nach UnixConn den Linux-Systemaufruf splice(2) verwenden. Die dadurch möglichen Vorteile dieses Musters im io-Paket werden sehr geschätzt.
  • In Go 1.22 wurden die Routing-Patterns verbessert, dadurch kann es jedoch zu kleineren Kompatibilitätsproblemen kommen. Das lässt sich über das Feld httpmuxgo121 steuern.
  • Ein Entwickler mag die in Go hinzugefügte Funktion „Funktionsbereich“ nicht. Er meint, sie biete im Verhältnis zur zusätzlichen Komplexität der Sprache nicht genug Komfort und passe nicht zum expliziten und einfachen Stil von Go.
  • Es wurde ein Link zu einer Diskussion darüber geteilt, dass in Go 1.22 bei jeder Iteration einer Schleife eine neue Variable erzeugt wird.
  • Die Ergänzung von sql.Null[T] wird begrüßt. Bisher wurde null von sqlboiler verwendet; es hat eine ähnliche API wie sql.Null, bietet zusätzlich aber die Methode IsSet() bool, die anzeigt, ob ein Wert explizit gesetzt wurde.
  • Die Aufnahme von Routing in die Standardbibliothek wird begrüßt, und man überlegt, ob sich die Bibliothek chi entfernen lässt.
  • Unter Entwicklern, die Go in Produktion einsetzen, gibt es die Frage, ob sie schnell auf neue Versionen umsteigen oder eher bei älteren Releases bleiben. Außerdem werden Meinungen zur Verwendung des Schlüsselworts any ausgetauscht.