Gopher to the rescue

Golumne Spezial: Go 1.12 wird reifer und reifer

Frank Müller

© Reneé French (CC BY 3.0 DE)

&

© Shutterstock / Lev22x (modifiziert)

Sechs Monate sind ins Land gegangen und Google bleibt im Takt: Gestern wurde Go 1.12 freigegeben. Und wie die Versionsnummer andeutet, enthält dieses Release keine Änderungen an der Sprache. Der Fokus lag auch dieses Mal auf den Werkzeugen, der Laufzeitumgebung sowie den Bibliotheken.

Den Beginn machen die unterschiedlichen unterstützten Plattformen. Hier bedient Go inzwischen ja so einige. Doch dies kann nicht für alle Releases aufrecht gehalten werden. So ist Go 1.12 die letzte Version, welche FreeBSD 10.x und macOS 10.10 Yosemite unterstützt, die 1.13 setzt jeweils FreeBSD 11.2+, FreeBSD 12.0+ oder macOS 10.11 El Capitan und später voraus.

Interessant ist auch die Unterstützung des ARM-Prozessors. So in Form des nun auch auf linux/arm64 arbeitenden Race Detectors oder dem windows/arm Port, der Windows 10 IoT Core auf 32-bit ARM-Prozessoren wie dem Raspberry Pi 3 unterstützt. Weitere Änderungen der Ports betreffen linux/ppc64cgo wird unterstützt – und aix/ppc64 für AIX 7.2 und später.

Werkzeugeinsatz

Wie schon bei den letzten Releases hat sich auch dieses Mal wieder etwas im Go-Werkzeugkasten getan. So wird beispielsweise go tool vet nicht mehr unterstützt. Für eine bessere Quelltextanalyse wurde go vet neu entwickelt und ist nun die Basis für unterschiedliche Analysewerkzeuge. Das Package golang.org/x/tools/go/analysis zeigt, wie diese zu entwickeln sind und enthält Unter-Packages mit diversen Tools. In diesem Rahmen wurde auch die Option -shadow durch ein eigenes, im Rahmen von go vet arbeitendes Werkzeug ersetzt.

Ein weiterer Schritt in Richtung Module ist die Abschaffung von $GOPATH/pkg. Ersatz hierfür ist der Build Cache im Verzeichnis go-build im jeweiligen Benutzer-Cache. Dessen Position richtet sich nach dem jeweiligen Betriebssystem. So ist er zum Beispiel unter macOS in ~/Library/Caches/ zu finden. Der Build Cache kann mit der Environment-Variable GOCACHE auch verschoben werden, seit diesem Release zudem via GOCACHE=off auch deaktiviert.

Seit der Version 1.11 kennt Go die Environment-Variable GO111MODULE. Ist sie jetzt auf on gesetzt, unterstützt das go-Kommando Befehle mit Bezug auf Module auch außerhalb eines Modulverzeichnisses. Daher verhalten sich go get, go list und go mod download wie in einem Modul mit anfänglich leeren Import-Anforderungen. In diesem Modus gibt go env GOMOD das Null Device des Systems aus, also /dev/null oder NUL.

Weitere modulbezogene Änderungen betreffen den parallelen Download, die Dokumentation der genutzten Go-Version in der Datei go.mod sowie eine höhere Flexibilität beim definierten Austausch von Modulen.

Auch der Compiler hat sich verbessert. Der Finalizer gibt Speicher nun früher frei, was allerdings über die Funktion runtime.KeepAlive() beeinflusst werden kann. Ebenso hat sich das Inlining erweitert, was jedoch Einfluss auf die Funktion runtime.Callers() hat. Daher wird hier die Verwendung von runtime.CallersFrames() angeraten. Weiter verbessert haben sich außerdem die Details für das Debugging und die Performance-Analyse. Bei all diesen Verbesserungen der Tools verwundert es nicht, dass auch die Laufzeitumgebung vielfach optimiert wurde.

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:

Happy Gophing!

Bibliotheken

Der zweite Schwerpunkt des neues Releases liegt wie bei den Releases zuvor auf der Verbesserung der Bibliotheken. Herausragend ist hier die optionale Unterstützung von TLS 1.3 in crypto/tls. Hierzu ist der Variable GODEBUG der Wert tls13=1 anzufügen. Derzeit ist der Support noch eingeschränkt nutzbar, wird aber ab Go 1.13 zum Standard gehören.

Weitere Änderungen und Ergänzungen sind zum Beispiel bytes.ReplaceAll() für den Ersatz von Werten sowie strings.ReplaceAll(). fmt wurde so erweitert, dass Maps nun mit sortierten Schlüsseln ausgegeben werden. Dies soll beim Testen helfen. Die Veränderungen in den Netzwerk-Packages zeigen, wie sehr die Sprache in diesem Umfeld eingesetzt wird. Es gibt darüber hinaus eine Vielzahl kleiner Änderungen, mit denen net, net/http, net/url und net/http/httputil reifer werden. Auch os kann mit Verbesserungen aufwarten. ProcessState.ExitCode liefert den Rückgabewert eines aufgerufenen Prozesses zurück, UserHomeDir() liefert das Benutzerverzeichnis.

Im Bereich WebAssembly gab es inkompatible Änderungen. Dies ist allerdings zu verschmerzen, da dieser Bereich noch experimentell ist und somit nicht der Go-1-Kompatibilitätszusage unterliegt. Im Zusammenhang mit WebAssembly wurden Callback in Func und NewCallback() in FuncOf() umbenannt. Das neue Interface Wrapper wird genutzt, wenn via ValueOf() der JavaScript Value einer Instanz ermittelt wird. Ein leeres Value entspricht nun dem JavaScript-Wert undefined statt der Zahl 0. Neu hinzugekommen ist die Value-Methode Truthy(), die auch dem Zustand des truthy in JavaScript entspricht.

Neben diesen Änderungen gab es noch diverse Ergänzungen oder Verbesserungen in Packages wie io, math, time, testing und mehr. Ein intensives Studium der Release Notes lohnt immer.

Fazit

Die 12 hinter dem Punkt deutet es an, Go wird reifer. Und, was wichtig ist, es bleibt kompatibel. Einzig experimentelle Bibliotheken verändern sich so, dass bestehender Code angepasst werden muss. Dies ist ein Versprechen, auf das sich die Entwicklergemeinde gerne verlässt. Um so verständlicher sind auch die Diskussionen über eingreifende Veränderungen durch Go 2. Doch bis dahin vergeht noch Zeit, die Version 1.12 steht zur Verfügung und Änderungswünsche für die Version 1.13 werden entgegen genommen.

DevOpsCon Istio Cheat Sheet

Free: BRAND NEW DevOps Istio Cheat Sheet

Ever felt like service mesh chaos is taking over? As a follow-up to our previous cheat sheet featuring the most important commands and functions, DevOpsCon speaker Michael Hofmann has put together the 8 best practices you should keep in mind when using Istio.

Verwandte Themen:

Geschrieben von
Frank Müller
Frank Müller
Der Oldenburger Frank Müller ist seit über dreißig Jahren in der IT zu Hause und im Netz vielfach als @themue anzutreffen. Das Interesse an Googles Sprache Go begann 2009 und führte inzwischen zu einem Buch sowie mehreren Artikeln und Vorträgen zum Thema.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
4000
  Subscribe  
Benachrichtige mich zu: