Die Programmiersprache Go 1.22 wurde veröffentlicht, die von Google in Zusammenarbeit mit der Community als hybride Lösung entwickelt wird, die die hohe Leistung kompilierter Sprachen mit den Vorteilen von Skriptsprachen kombiniert, wie z.B. einer einfachen Codeerstellung, schneller Entwicklung und Fehlerresistenz. Der Code des Projekts wird unter der BSD-Lizenz verbreitet.
Die Syntax von Go basiert auf gewohnten Elementen der Programmiersprache C mit einzelnen Übernahmen aus der Sprache Oberon. Die Sprache ist recht prägnant, jedoch lässt sich der Code leicht lesen und erfassen. Go-Code wird in separate binäre ausführbare Dateien kompiliert, die nativ ohne Verwendung einer virtuellen Maschine ausgeführt werden (Profilierungs-, Debugging- und andere Fehlersubsysteme werden als Runtime-Komponenten integriert), was eine Leistung vergleichbar mit Programmen in C ermöglicht.
Das Projekt wurde ursprünglich mit Blick auf Multithreading und effektives Arbeiten auf Mehrkernsystemen entwickelt und bietet unter anderem auf der Ebene von Operatoren implementierte Mittel zur Organisation paralleler Berechnungen und zur Interaktion zwischen parallel ausgeführten Methoden. Die Sprache bietet auch integrierte Schutzmittel gegen den Zugriff auf nicht zulässige Bereiche der zugewiesenen Speicherblöcke und ermöglicht die Verwendung eines Garbage Collectors.
Zu den Änderungen in der neuen Version gehören:
- Die 'for'-Schleifen unterstützen jetzt die Definition von Bereich aus Ganzzahlen, zum Beispiel kann für die Iteration über Werte von 0 bis 9 jetzt die Schleife 'for i := range 10 {...}' verwendet werden.
- Die 'for'-Schleifen haben experimentelle Unterstützung für Bereichsbestimmungsfunktionen hinzugefügt (GOEXPERIMENT=rangefunc), die es erlauben, eine Funktion als Iterator anzugeben. Zum Beispiel 'for i, x := range slices.Backward(s) {...}'
- Ein lang bestehendes Problem bei den 'for'-Schleifen wurde behoben, das beim Aufruf von Goroutinen zu einer gemeinsamen Nutzung der Schleifenvariablen in verschiedenen Iterationen führte. Zum Beispiel 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 zuvor.
- Es wurde eine Optimierung des Speicherverhaltens zur Laufzeit durchgeführt, die zu einer Leistungssteigerung von 1-3% und einer Reduzierung des Speicherverbrauchs in den meisten Anwendungen um 1% führte.
- Die Arbeit an der Aktivierung von Optimierungen im Compiler auf der Grundlage der Code-Profilierungsergebnisse (PGO - Profile-guided Optimization) wurde fortgesetzt. Diese ermöglichen es, während der Programmausführung bestimmte Merkmale zu berücksichtigen. In der neuen Version werden im Compiler Methoden zur Devirtualisierung eingesetzt, um indirekte Aufrufe verschiedener Methoden durch die Ausführung entfalteter Inline-Blöcke zu ersetzen.
- Mit der Aktivierung von PGO konnte die Leistung der meisten Programme um 2-14 % erhöht werden.
- Im Compiler wurde eine experimentelle (GOEXPERIMENT=newinliner) verbesserte Implementierung des Inlining-Mechanismus hinzugefügt, die eine Heuristik zur Trennung wichtiger und unwichtiger Operationen verwendet.
- In die Standardbibliothek wurde das Paket „math/rand/v2“ hinzugefügt, das eine ganzheitlichere API und schnellere Algorithmen zur Erzeugung von Pseudo-Zufallszahlen bietet.
- Im Paket net/http.ServeMux wurde die Möglichkeit hinzugefügt, Methoden und Masken in Mustern anzugeben, beispielsweise wird das Muster „GET /static/{id}/“ für Anfragen mit der HTTP-Methode „GET“ angewendet und speichert den Wert des zweiten Segments des angeforderten Pfades im Identifikator „id“.
- Im Paket database/sql wurde die Unterstützung für den Typ Null[T] hinzugefügt, der es ermöglicht, Spalten zu scannen, die den Wert NULL annehmen können. Im Paket slices wurde die Funktion Concat hinzugefügt, um mehrere Slices beliebigen Typs zusammenzuführen.
- In den Befehlen zur Arbeit mit Arbeitsbereichen (Sammlungen von Modulen) wurde die Möglichkeit geschaffen, das Verzeichnis „vendor“ zu verwenden, das Abhängigkeiten zum Inhalt des Arbeitsbereichs enthält. Das Verzeichnis wird beim Ausführen des Befehls „go work vendor“ erstellt und wird in den Build-Befehlen verwendet, wenn die Option "-mod=vendor" gesetzt ist (dies wird standardmäßig aktiviert, wenn ein vendor-Verzeichnis vorhanden ist).
Änderungen im Verhalten der Dienstprogramme.
- go get wird nicht mehr außerhalb des Moduls im veralteten GOPATH-Modus (d. h. mit GO111MODULE=off) unterstützt. Andere Build-Befehle wie go build und go test werden weiterhin für veraltete GOPATH-Programme für unbestimmte Zeit funktionieren.
- go mod init versucht nicht mehr, Anforderungen an Module aus Konfigurationsdateien anderer Anbieterwerkzeuge (wie Gopkg.lock) zu importieren.
- go test -cover druckt jetzt zusammenfassende Informationen über die Abdeckung für Pakete aus, die keine eigenen Testdateien haben. Vor Go 1.22 hätte go test -cover für ein solches Paket berichtet? mymod/mypack [no test files]
Und jetzt werden mit Go 1.22 Funktionen im Paket als nicht abgedeckt betrachtet: mymod/mypack coverage: 0.0% der Anweisungen. Bitte beachten Sie: Wenn ein Paket überhaupt keinen ausführbaren Code enthält, können wir keinen signifikanten Abdeckungsprozentsatz melden; für solche Pakete wird go test weiterhin über das Fehlen von Testdateien berichten.
- Die Weboberfläche des Trace-Tools wurde leicht aktualisiert, um die Unterstützung des neuen Tracers zu ermöglichen. Einige Probleme wurden behoben und die Lesbarkeit verschiedener Seiten verbessert. Die Weboberfläche unterstützt jetzt das Durchsuchen von Traces in einer streamorientierten Ansicht. Der Trace-Viewer zeigt jetzt auch die gesamte Dauer aller Systemaufrufe an. Diese Verbesserungen gelten nur für das Anzeigen von Traces, die von Programmen erstellt wurden, die mit Go 1.22 oder neuer erstellt wurden. In einer zukünftigen Version werden einige dieser Verbesserungen in Traces übernommen, die mit älteren Versionen von Go erstellt wurden.
- Der Ausführungsbereich speichert jetzt Metadaten zur Speicherbereinigung basierend auf Typen näher bei jedem Heap-Objekt. Diese Änderung reduziert auch den Speicherverbrauch der meisten Go-Programme um etwa 1 % durch die Deduplizierung redundanter Metadaten. In einigen Programmen kann die Verbesserung geringer ausfallen, da diese Änderung die Grenzen der Klassengröße des Speichersortierers anpasst, sodass einige Objekte in eine höhere Klassengröße verschoben werden können. Eine Folge dieser Änderung ist, dass die Adressen einiger Objekte, die zuvor immer auf einer 16-Byte-Grenze (oder höher) ausgerichtet waren, jetzt nur noch auf einer 8-Byte-Grenze ausgerichtet sind. Einige Programme, die Assembleranweisungen verwenden, die erfordern, dass Adressen im Speicher auf Größen von mehr als 8 Byte ausgerichtet sind und sich auf das vorherige Verhalten der Ausrichtung des Speichersortierers verlassen, können fehlschlagen, aber wir erwarten, dass solche Programme selten sein werden. Diese Programme können mit GOEXPERIMENT=noallocheaders erstellt werden, um zur alten Metadatenmodell zurückzukehren und das vorherige Ausrichtungsverhalten wiederherzustellen, aber Paketbesitzer sollten ihren Assemblercode aktualisieren, um Annahmen über die Ausrichtung zu vermeiden, da dieser Workaround in einer zukünftigen Version entfernt wird.
- Wie in den Veröffentlichungsnotizen von Go 1.20 erwähnt, erfordert Go 1.22 jetzt die endgültige Version von Go 1.20 oder neuer für die Erstinstallation. Wir erwarten, dass Go 1.24 die endgültige Version von Go 1.22 oder höher für die Erstinstallation erfordert.
Original (go.dev)
Quelle: linux.org.ru
