Go 1.11 veröffentlicht: Go Modules und WebAssembly Support

© Reneé French (CC BY 3.0 DE) ©SuS Media
Wie erwartet hat Google im gewohnten Takt die neueste Version der Programmiersprache Go vorgestellt. Diese dynamisch in ihrer Beliebtheit zunehmende Sprache hat damit inzwischen Version 1.11 erreicht. Die gleichbleibende Hauptversion „1“ zeigt, dass sich der Sprachkern nicht verändert hat. Der Nutzer kann sich hier also ruhigen Gewissens darauf verlassen, mögliche Änderungen einer Version 2 werden unterdessen weiterhin rege diskutiert.
Die hohe Nebenversionsnummer verdeutlicht hingegen, wie sehr sich die Infrastruktur dieser Sprache weiterentwickelt. Die Sprache ist mit der Zeit robuster geworden und deckt mehr Plattformen ab, außerdem gibt es ständig umfassendere Tools und weitere Bibliotheken, das ist man bereits aus den vergangenen Jahren gewohnt. Zwei Erweiterungen sind allerdings so besonders, dass ihre Tragweite durch den kleinen Sprung von Go 1.10 auf Go 1.11 nicht richtig abgebildet wird. Doch Google bleibt konsequent, nach der 10 kommt nun einmal die 11.
Es ist ja bekannt, dass die Sprache bereits heute viele Plattformen unterstützt. Sowohl aus Sicht der Betriebssysteme als auch bezüglich der Prozessoren. Hier ergibt sich eine Reihe kleinerer Änderungen. So wird macOS nur mehr ab der Version 10.10 unterstützt, Windows ab Version 7 und OpenBSD ab 6.2. Inzwischen ist auch OpenBSD 6.4 eine der abgedeckten Plattformen, die jedoch keinen Support durch ältere Go-Versionen erhalten wird. Weitere Änderungen betreffen den PowerPC, MIPS oder ARM und Betriebssysteme wie NetBSD.
Go 1.11: WebAssembly Support & Go Modules
Doch die wahren Neuerungen in Go 1.11 sind wie gesagt andere. Dazu gehört einerseits die, wenn auch noch experimentelle, Unterstützung von WebAssembly. Sie erlaubt die Ausführung von Go-Programmen im Web-Browser als eine schnelle Ergänzung zu JavaScript. Die Motivation hinter WebAssembly ist die Möglichkeit, binäre Programme schneller als komplexe JavaScript-Programme in einem Browser laden und auch dort mit höherer Performanz ausführen zu können. In Zeiten des Browsers als universelles Frontend immer komplexerer Anwendungen war dies schon lange überfällig. Kompilierte Go-Anwendungen enthalten die komplette Laufzeitumgebung, das Scheduling der Goroutinen, das Garbage Collecting und alles, was als Basis für Go-Anwendungen benötigt wird. Dies ergibt eine Minimalgröße von etwa 2 MB beziehungsweise 500 KB im komprimierten Zustand. Über das neue Package syscall/js
können die Programme mit JavaScript interagieren. Damit ergibt sich für Go eine Vielzahl neuer Anwendungsmöglichkeiten, ebenso wie auch ein konsequenterer Fullstack-Einsatz der Sprache.
Der zweite große Block ist die Einführung der Modules basierend auf dem vgo
-Konzept von Russ Cox. Es gilt als noch nicht ausgereift, soll aber spätestens mit der Go 1.12 seinen endgültigen Weg in das Toolset der Sprache finden. Die aktuelle Version dient dazu, hierfür die notwendigen Erfahrungen und das Feedback der Anwender zu sammeln. Alle Änderungen in Go 1.12 sollen dann aber kompatibel sein. Ziele sind ein zuverlässigeres und reproduzierbareres Build – auch unabhängig vom GOPATH
. Notwendig ist, dass Versionen entsprechend in den Repositorys getaggt und/oder als Pfadbestandteil gespeichert werden sowie eine Datei go.mod
existiert, die Informationen zum aktuellen Modul und den Abhängigkeiten enthält. Die Speicherung in einer speziellen Verzeichnisstruktur erlaubt so die Arbeit mit mehreren unterschiedlichen Versionen eines Moduls gleichzeitig. Dies war mit dem bisherigen einfachen go get
nicht möglich. Ein Seiteneffekt ist, dass die Version 1.11 die letze Version mit der Einstellung GOCACHE=off
. Hintergrund ist die Abschaffung von $GOPATH/pkg
im Rahmen der Module. Somit kann dieses Setting bereits jetzt nur noch eingeschränkt genutzt werden.

Gopher ante portas: Go hält Einzug auf JAXenter!
Wenige (relativ) neue Programmiersprachen erfreuen sich derzeit einer so großen Belibtheit wie Go. Googles Alternative für „C“ ist immer häufiger Zentrum interessanter Anwendungen und mittlerweile im Mainstream angekommen. Grund genug, sich ein wenig eingehender mit der Sprache zu befassen. Folgende Artikel, Kolumnen und Infografiken sind Teil unserer aktuellen Go-Aktion auf JAXenter:
- Christoph Engelbert: 5 Dinge, die man an Go hassen kann (aber nicht muss)
- Sebastian Holstein: Go im Browser: WebAssembly-Anwendungen in Go schreiben
- Dominik Mohilo: Go Cloud: Portierbare Cloud-Anwendungen mit Go
- Dominik Mohilo: Markenidentität von Go definiert: Logo, Style-Guide & Präsentationsvorlagen
- Andreas Mohrhard: AWS Lambda und Go – ein perfektes Team
- Frank Müller: Go 1.11 veröffentlicht: Go Modules und WebAssembly Support
- Frank Müller: Go 1.10 bringt viele Verbesserungen für Packages, Tools und Laufzeitsysteme
- Frank Müller: Die Golumne: Go – die C-volution von Google
- Frank Müller: Die Golumne: Go Concurrency – nebeneinander und doch miteinander
- Marcel Richters: Google veröffentlicht Umfrageergebnisse zu Programmiersprache Go
- Tim Scheuermann: Go Infografik: Die wichtigsten Sprachkonstrukte auf einen Blick
- Andreas Schröpfer: Testen und Benchmarks in Go
- Ralf Wirdemann: Schnittstellen leicht gemacht – RESTful APIs in Go
Happy Gophing!
Abrundung
Wie immer hat Google einiges getan, um Build-Zeiten zu verkürzen und Laufzeiten zu beschleunigen. Ebenso erzeugt der Compiler nun bessere Debugging-Informationen auch bei optimierten Programmen. Experimentell wird auch der Aufruf von Go-Funktionen innerhalb eines Debuggers unterstützt, allerdings bisher nur in Delve. Auch das Tracing von Anwendungen und die Visualisierung sind leistungsfähiger geworden. Zur Steigerung der Qualität ist nun auch der automatische Aufruf von go vet
vor dem Aufruf von go test
strenger. Fehlschlagende Typenprüfungen werden jetzt auch als fatale Fehler und nicht mehr nur als Warnungen angezeigt.
Wie mit jedem Release wurde auch die Runtime leistungsfähiger. So hat der Heap in Go 1.11 keine Grenze von 512 GB mehr. Damit werden einige der bisherigen seltenen Fehler bei Kompilierungen mit -race
vermieden. Ebenso neu ist die Nutzung von libSystem.so
unter macOS und iOS für eine höhere Systemkompatibilität. Individuelle Konstrukte wurden ebenfalls optimiert, zum Beispiel das Löschen von Maps in Schleifen. Dazu kommen Bounds Checking und Verzweigungen, Erweiterungen für Stack Traces über Goroutine-Grenzen hinweg und Profiling.
Neben allen Tools und der Laufzeitumgebung werden natürlich auch mit jedem Release die Bibliotheken verbessert oder erweitert. So sind die Crypto Packages nun stellenweise noch zufälliger und vollständiger, Encoding und Decoding wurden konsistenter. Eine Situation, in der html/template
bisher <nil>
ausgegeben hat, wird nun wie bei nicht typisierten Nil
-Werten nichts mehr ausgegeben. Das net
Package erlaubt nun das Setzen von Socket-Optionen vor dem Annehmen und Erzeugen von Verbindungen. Gleichzeitig wurden Fehler auf unterschiedlichen Plattformen behoben. Auch net/http
und net/http/httputil
bieten mehr Optionen für robuste Anwendungen, zum Beispiel die Limitierung der Anzahl an Verbindungen. Dazu einen Satz weitere Abrundungen, welche die Bedeutung der Netzwerkpakete zeigen. Ebenso wichtig wie das Netz ist der Umgang mit dem Betriebssystem. Dies spiegelt sich in den Erweiterungen der Packages os
, os/signal
, os/user
und auch io/ioutil
wieder. Viele weitere kleine Änderungen runden Googles Aufwände ab.
Fazit
Wie es das sanfte und stetige Inkrement der Nebenversionsnummer andeutet, reifen Toolset, Laufzeitumgebung und Bibliotheken der Sprache Google Go kontinuierlich – so auch wieder in Go 1.11. Die Benutzer erhalten ein stabileres und umfangreicheres Werkzeug, ohne mit der Vergangenheit zu brechen. Jedoch wird der Einzug der Module bei vielen Entwicklern von Bibliotheken, gerade in der Open-Source-Szene, noch zu Überarbeitungen ihres Angebots führen. Nicht ohne Aufwand, aber für die Zukunft wichtig.
Hinterlasse einen Kommentar