Die Version der Programmiersprache Go 1.22 wurde vorgestellt. Sie wird von Google in Zusammenarbeit mit der Community entwickelt und kombiniert die hohe Leistung von kompilierenden Sprachen mit den Vorteilen von Skriptsprachen, wie einfacher Codeerstellung, schneller Entwicklung und Fehlersicherheit. Der Code des Projekts wird unter der BSD-Lizenz veröffentlicht.
Die Syntax von Go basiert auf vertrauten Elementen der C-Sprache mit einzelnen Entlehnungen aus der Sprache Oberon. Die Sprache ist recht prägnant, wobei der Code leicht zu lesen und zu verstehen ist. Code in Go wird in separate, native ausführbare Binärdateien kompiliert, ohne eine virtuelle Maschine zu verwenden (Profilierungs-, Debugging- und andere Subsysteme zur Fehlererkennung werden als Runtime-Komponenten integriert), was eine Leistung ermöglicht, die mit Programmen in C vergleichbar ist.
Das Projekt wird ursprünglich mit Blick auf parallele Programmierung und effizientes Arbeiten auf Mehrkernsystemen entwickelt. Es bietet unter anderem Operator-Level-Tools zur Organisation paralleler Berechnungen und zur Interaktion zwischen gleichzeitig ausgeführten Methoden. Die Sprache bietet zudem integrierte Mechanismen zum Schutz vor dem Überschreiten zulässiger Bereiche zugewiesener Speicherblöcke und ermöglicht die Verwendung eines Garbage Collectors.
Zu den Änderungen in der neuen Version gehören:
- In 'for'-Schleifen wurde die Unterstützung für die Definition von Bereichen aus Ganzzahlen hinzugefügt. Zum Beispiel kann jetzt für die Iteration über Werte von 0 bis 9 die Schleife 'for i := range 10 {…}' verwendet werden.
- In 'for'-Schleifen wurde experimentelle Unterstützung für Bereichsfunktionsdefinitionen (GOEXPERIMENT=rangefunc) hinzugefügt, welche es ermöglicht, eine Funktion als Iterator anzugeben. Zum Beispiel: 'for i, x := range slices.Backward(s) {…}'
- Ein langjähriges Problem mit 'for'-Schleifen wurde gelöst, das bei der Verwendung von Goroutinen zu gemeinsam genutzten Schleifenvariablen in verschiedenen Iterationen führte. Beispielsweise wird der Code values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } jetzt 'a', 'b' und 'c' ausgeben, anstatt nur 'c', wie es zuvor der Fall war.
- Die Speicherverwaltung im Runtime wurde optimiert, was zu einer Leistungssteigerung von 1-3% und einer Reduzierung des Speicherverbrauchs in den meisten Anwendungen um 1% führte.
- Die Arbeit an der Implementierung von Codeprofilierungs-basierten Optimierungen (PGO – Profile-guided optimization) im Compiler wird fortgesetzt, die die zur Laufzeit der Programme festgestellten Besonderheiten berücksichtigen. In der neuen Version nutzt der Compiler Maßnahmen zur Devirtualisierung, um indirekte Aufrufe verschiedener Methoden durch ausgeweitete Inline-Blöcke zu ersetzen.
- Mit der Aktivierung von PGO konnte die Leistung der meisten Programme um 2-14% gesteigert werden.
- Der Compiler hat eine experimentelle (GOEXPERIMENT=newinliner) verbesserte Implementierung des Inlining-Mechanismus hinzugefügt, die eine Heuristik zur Trennung wichtiger und weniger wichtiger Operationen verwendet.
- Die Standardbibliothek hat das Paket „math/rand/v2“ hinzugefügt, das eine umfassendere API bietet und schnellere Algorithmen zur Erzeugung von Pseudozufallszahlen verwendet.
- Dem Paket net/http.ServeMux wurde die Möglichkeit hinzugefügt, Methoden und Masken in Vorlagen anzugeben. Beispielsweise wird die Vorlage „GET /static/{id}/“ auf Anfragen mit der HTTP-Methode „GET“ angewendet und speichert den Wert des zweiten Segments des angeforderten Pfads im Identifikator „id“.
- Das Paket database/sql unterstützt den Typ Null[T], der das Scannen von Spalten ermöglicht, die NULL-Werte annehmen können. Im Paket slices wurde die Funktion Concat hinzugefügt, um mehrere Slices beliebigen Typs zusammenzuführen.
- In Teams zur Arbeit mit Arbeitsbereichen (Modulsammlungen) gibt es die Möglichkeit, das Verzeichnis „vendor“ zu verwenden, das Abhängigkeiten für den Arbeitsbereich enthält. Das Verzeichnis wird beim Ausführen des Befehls „go work vendor“ erstellt und in den Build-Befehlen verwendet, wenn die Option "-mod=vendor" angegeben ist (automatisch aktiviert, wenn das Verzeichnis vendor vorhanden ist).
Änderungen im Verhalten der Utilities.
- go get wird außerhalb des Moduls im veralteten GOPATH-Modus (d. h. mit GO111MODULE=off) nicht mehr unterstützt. Andere Build-Befehle wie go build und go test bleiben für veraltete GOPATH-Programme noch eine Zeit lang funktionsfähig.
- go mod init versucht nicht mehr, Modulanforderungen aus Konfigurationsdateien anderer Anbieter-Tools (wie Gopkg.lock) zu importieren.
- go test -cover gibt jetzt eine Zusammenfassung der Abdeckung für Pakete aus, die über keine eigenen Testdateien verfügen. Vor Go 1.22 würde go test -cover für solche Pakete? mymod/mypack [keine Testdateien] berichten.
Mit Go 1.22 gelten Funktionen im Paket als nicht abgedeckt: mymod/mypack coverage: 0,0 % der Anweisungen. Hinweis: Wenn ein Paket überhaupt keinen ausführbaren Code enthält, können wir keinen signifikanten Prozentsatz der Abdeckung melden; für solche Pakete wird go test weiterhin berichten, dass keine Testdateien vorhanden sind.
- Die Weboberfläche des Trace-Tools wurde leicht aktualisiert, um die Unterstützung für den neuen Tracer zu erweitern. Einige Probleme wurden behoben und die Lesbarkeit verschiedener Seiten verbessert. Die Weboberfläche unterstützt jetzt die Untersuchung von Traces in einer stream-orientierten Ansicht. Der Trace-Viewer zeigt nun auch die gesamte Dauer aller Systemaufrufe an. Diese Verbesserungen gelten nur für die Anzeige von Traces, die von Programmen erstellt wurden, die mit Go 1.22 oder neuer erstellt wurden. In einem zukünftigen Release werden einige dieser Verbesserungen auch für Traces, die mit älteren Versionen von Go erstellt wurden, verfügbar sein.
- Die Laufzeitumgebung speichert nun die Metadaten der Garbage Collection basierend auf den Typen näher bei jedem Heap-Objekt. Diese Änderung reduziert auch den Speicherbedarf der meisten Go-Programme um etwa 1 % durch die Deduplizierung redundanter Metadaten. In einigen Programmen könnte die Verbesserung geringer ausfallen, da diese Änderung die Klassengrenzen des Memory-Allocators anpasst, sodass einige Objekte in eine höhere Klassengröße verschoben werden. Eine Folge dieser Änderung ist, dass die Adressen bestimmter Objekte, die zuvor immer an einer 16-Byte-Grenze (oder höher) ausgerichtet waren, nun nur noch an einer 8-Byte-Grenze ausgerichtet sein werden. Einige Programme, die Assembler-Anweisungen verwenden, welche verlangen, dass Speicheradressen an Größen von mehr als 8 Bytes ausgerichtet sind und auf das vorherige Verhalten des Allocators angewiesen sind, könnten fehlerhaft sein, aber wir erwarten, dass solche Programme selten sind. Diese Programme können mit GOEXPERIMENT=noallocheaders erstellt werden, um zur alten Metadatenmodell zurückzukehren und das vorherige Ausrichtungsverhalten wiederherzustellen, jedoch sollten Paketinhaber ihren Assembler-Code aktualisieren, um Annahmen über die Ausrichtung zu vermeiden, da dieser Umweg in einer zukünftigen Version entfernt wird.
- Wie in den Anmerkungen zum Go 1.20-Release erwähnt, benötigt Go 1.22 jetzt die finale Version von Go 1.20 oder neuer für die initiale Kompilierung. Wir erwarten, dass Go 1.24 die finale Version von Go 1.22 oder später für die initiale Kompilierung erfordern wird.
Original (go.dev)
Quelle: linux.org.ru
