Programmiersprache: Go 1.17 stutzt Dependencies und erweitert Plattformanbindung

Neben einem vereinfachten Modulgraph bringt das Release Optimierungen beim Compiler mit. Außerdem lässt sich nun Code für Windows auf 64-bit ARM erstellen.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Lesezeit: 3 Min.

Das Team hinter Go hat Version 1.17 der Programmiersprache veröffentlicht. Wie bei den vorherigen Releases liegt der Großteil der Neuerungen unter der Haube: Der Compiler bringt Optimierungen zugunsten der Performance der erstellten Programme mit und das Go-Team hat die Dependencies in den Modulgraphen vereinfacht. Auf Sprachebene führt das Release im Paket unsafe neue Funktionen zum Umgang mit Pointern ein.

Schließlich gibt es einige Ergänzungen bei den Plattformen. Nachdem Go 1.16 eine native Anbindung an Apple Silicon mitgebracht hatte, zielt das aktuelle Release auf 64-bit-ARM-Architekturen unter Windows inklusive der Integration von C-Code über das Tool cgo. Letztere funktioniert nun auch für 64-bit-MIPS-Architekturen unter OpenBSD.

Der Compiler nutzt für das Übergeben von Funktionsargumenten und Ergebnissen nicht mehr den Stack, sondern Register. Laut den Release Notes führt das Vorgehen im Schnitt zu einer um 5 Prozent verbesserten Performance der kompilierten Programme, die zudem durchschnittlich zwei Prozent schlanker sein sollen.

Die Heise-Konferenz zu Go

Am 10. November dreht sich bei der betterCode() Go alles um die von Google entwickelte Programmiersprache. Die von heise Developer und dpunkt.verlag ausgerichtete Online-Konferenz richtet sich an Entwicklerinnen und Entwickler, die sich Go im Detail ansehen wollen und den Einsatz erwägen.

Das Programm startet mit einem Einstieg in Go inklusive der Standard Library und dem Ökosystem, gefolgt von Beiträgen zu Concurrency und Go Interfaces. In einem zweigeteilten Vortrag zeigt Go-Experte Frank Müller, wie Entwicklerinnen und Entwickler Webanwendungen in Go schreiben können und gibt wertvolle Tipps und Tricks mit an die Hand. Neben einem Vortrag zu gRPC vs. HTTP/JSON bietet die betterCode() Go Themen wie Property-Based Testing mit Go.

Go kennt seit Version 1.11 das Konzept der Module als Alternative zu GOPATH. Module sind Pakete mit einem gemeinsamen Import-Präfix, die über Semantic Versioning versioniert sind. Das Modulsystem soll den Umgang mit Dependencies und das Versionieren vereinfachen und ist seit Go 1.16 standardmäßig aktiviert.

Das aktuelle Release vereinfacht nun den Modulgraph für die Abhängigkeiten: Module, die in der Definitionsdatei go.mod eine Version ab dem aktuellen go 1.17 spezifizieren, stellen im Modulgraph nur die direkten Dependencies zu anderen Go-Modulen dar und keine transitiven Abhängigkeiten. Für Letztere beschreibt die Anweisung require die benötigten Module.

Go 1.17 bringt zudem zwei Funktionen im Paket unsafe mit, das unter anderem den direkten Zugriff auf Binärwerte von Variablen im Speicher über unsafe.Pointer ermöglicht. Die neue Funktion Add bietet einen besser kontrollierten Weg für Zeigerarithmetik als die direkte Addition über +.

Die zweite neue Funktion Slice gibt ein Slice zurück, dessen zugrundeliegendes Array an der Position des übergebenen Zeigers startet. Die Funktion

func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType

entspricht laut Dokumentation im Wesentlichen der Umsetzung über

(*[len]ArbitraryType)(unsafe.Pointer(ptr))[:]

gibt aber den Wert nil zurück, wenn der Zeiger den Wert nil hat und die in len spezifizierte Länge Null ist. Sollte die Länge negativ sein oder der Zeiger den Wert nil haben, während die Länge nicht Null ist, löst Slice einen Laufzeitfehler als Panic aus.

Auch den umgekehrten Weg ermöglicht Go 1.17 und wandelt Slices in Array-Zeiger um. Voraussetzung dafür ist, dass das Slice mindestens so groß ist wie das Array.

Weitere Neuerungen lassen sich dem Go-Blog entnehmen. Die vollständige Liste der Neuerungen findet sich in den Release Notes. Der Sourcecode sowie Binaries für unterschiedliche Betriebssysteme und Architekturen stehen auf der Download-Seite bereit.

(rme)