Programmiersprache: Go 1.16 setzt verstärkt auf Module und kennt Apple Silicon

Das in Version 1.11 eingeführte Konzept der Module ist nun standardmäßig aktiviert. Außerdem kann Go nun statische Dateien einbinden.

In Pocket speichern vorlesen Druckansicht 35 Kommentare lesen
Lesezeit: 4 Min.
Inhaltsverzeichnis

Google hat Version 1.16 der Prgrammiersprache Go veröffentlicht, die wie der Vorgänger vor allem Neuerungen unter der Haube mitbringt. Das in Version 1.11 eingeführte Modulsystem ist nun standardmäßig aktivert, und der go-Befehl erlaubt das Einbinden statischer Dateien. Für deren Verarbeitung bringt die Core Library ein eigenes Paket mit.

Bei den Plattform-Ports dürfte die Anbindung an Apple Silicon wenig überraschen. Das Kompilieren auf die 64-bit-ARM-Architektur erfolgt über die Parameter GOOS=darwin, GOARCH=arm64, und der Port arbeitet mit cgo zum Erstellen von Go-Paketen zusammen, die C-Code aufrufen. Im Zuge der Integration hat das Team den iOS-Port von darwin/arm64 nach ios/arm64 umbenannt.

Seit Version 1.11 kennt Go das Konzept der Module als Alternative zu GOPATH. Das System, das den Umgang mit Dependencies und das Versionieren vereinfachen soll, ist nun standardmäßig aktiviert. Module sind Pakete mit einem gemeinsamen Import-Präfix, die über Semantic Versioning versioniert sind. Die Umgebungsvariable GO111MODULE hat im aktuellen Release standardmäßig den Wert on, auch wenn keine go.mod-Datei im Arbeitsverzeichnis existiert. Für das alte Verfahren, die zum Aktivieren des Modulsystems eine passende Datei erfordert, lässt sich die Umgebungsvariable auf den Wert auto setzen.

Build-Befehle wie go build und go test ändern die Dateien go.mod und go.sum nicht mehr selbsttätig, sondern melden einen Fehler, wenn eine Modulanforderung oder eine Prüfsumme fehlt oder veraltet ist. Eine automatisierte Anpassung lässt sich über go mod tidy or go get durchführen.

Der Befehl go install erlaubt nun das Anfügen einer Version in Form von @latest oder über eine spezifische Nummer wie @v1.0.0. Für den Build und die Installation im Modulmodus gilt der Befehl go install als Mittel der Wahl.

Der go-Befehl kann über die Direktive //go:embed statische Dateien und Dateibäume in das Executable einbinden. Für die Verarbeitung der Inhalte bringt die Core Library das neue Paket embed mit. Die Dateiinhalte lassen sich nutzen, um einen string ein []byte-Slice beziehungsweise -Array oder ein Dateisystem-Interface FS nutzen:

import _ "embed"

// Einbindung als String
//go:embed hello.txt
var s string
print(s)

// Einbindung als Byte Slice
//go:embed hello.txt
var b []byte
print(string(b))

// Einbindung als Datei(en) in einem File System
//go:embed hello.txt
var f embed.FS
data, _ := f.ReadFile("hello.txt")
print(string(data))

Das zuletzt genutzte Interface fs.FS ist ebenfalls eine Neuerung, die im aktuellen Release Einzug in das Paket io/fs hält. Sie dienst als Abstraktion für Dateibäume mit reinem Lesezugriff.

Neben den Neuzugängen bei den Libraries ist erwähnenswert, dass das Paket io/ioutil nun als veraltet gilt. Als Grund nennt die Ankündigung zu Go 1.16, dass es sich bei dem Package um eine "schlecht definierte und schwer verständliche Sammlung" gehandelt habe. Die jeweiligen Funktionen sind nun in den Paketen io und os verfügbar.

Auch wenn io/ioutil zunächst nicht verschwinden soll, empfiehlt die Dokumentation den Umstieg auf die jeweils neuen Namen: io.Discard, io.NopCloser, io.ReadAll, os.ReadDir, os.ReadFile, os.MkdirTemp, os.CreateTemp und os.WriteFile.

2009 hat Google die Programmiersprache Go erstmals der Öffentlichkeit vorgestellt und sie als Alternative zu C positioniert. 2015 befreite sich das Projekt von den letzten C-Überbleibseln im Code und besitzt seitdem eine komplett in Go geschriebene Toolchain und Laufzeitumgebung. Die Programmiersprache unterstützt Nebenläufigkeit und entstand vor allem mit Blick auf verteilte Cloud- und Serveranwendungen. Zu den Vorzeigeprojekten gehören Kubernetes, Istio und Docker.

Eine mit Spannung erwartete Ergänzung befindet sich derzeit noch in der Umsetzung: Generics sollen nach den aktuellen Plänen Ende des Jahres als Beta-Feature Einzug in die Programmiersprache halten. Derzeit müssen Entwicklerinnen und Entwickler Datenstrukturen wie Listen oder Bäume für jeden konkreten Datentyp separat implementieren und grundlegende Funktionen unter anderem zum Sortieren für jede Umsetzung neu erstellen.

Anfangs hatte sich das Team bewusst gegen die aus anderen Programmiersprachen bekannten Konzepte der generischen Programmierung entschieden, um die Komplexität gering zu halten. Aufgrund der Vorzüge, die Generics bringen, stehen sie jedoch schon länger auf dem Wunschzettel der Community. Im Juni hat das Go-Team daher einen Designentwurf für Typparameter als Grundlage vorgelegt und sich zu den weiteren Plänen geäußert.

Weitere Neuerungen und Änderungen in Go 1.16 lassen sich den Release Notes in der Dokumentation der Programmiersprache entnehmen.

(rme)