Revolution? Erst mit Go 2

Golumne Spezial: Go 1.13 – Glück oder Pech?

Frank Müller

© Reneé French (CC BY 3.0 DE) ©SuS Media

Es ist mal wieder soweit, eine neue Version von Go 1 ist freigegeben worden. Dieses mal ist es die Version 1.13. Für die einen ist die 13 mit Glück verbunden, für die anderen mit Pech. Wie schlägt sich Go hier?

Nach Aussagen der Fans der Sprache, welche die Entwicklung über die letzten Monate intensiv beobachtet und beeinflusst haben, handelt es sich um die bisher beste Version. Dies sollte auch nicht verwundern, verspricht das jeweils aktuelle Release genau das ja immer. Doch bei Go 1.13 wird ein Feature, das nicht zur Sprache oder den Bibliotheken gehört, dennoch herausragend. Mit dieser Version werden die Go Modules nämlich zum Standard – die Test- und Einführungsphase ist vorbei. So existiert die Environment-Variable GO111MODULE weiterhin mit dem Standardwert auto, doch go get wertet dieses auch für Verzeichnisse mit einer go.mod aus, wenn diese im GOPATH enthalten sind. Dies war bisher strikt getrennt. Hinzu kommt die neue Variable GOPRIVATE für nicht öffentliche Pfade. Dies ist wichtig für den Umgang mit Module-Proxys und Checksummen-Datenbanken.

Diese beiden Komponenten bilden gemeinsam eine Infrastruktur für die Bereitstellung von Modulen sowie der Sicherstellung ihrer Integrität. Die Module-Proxys stellen Kopien der Module in den unterschiedlichen über Tags freigegebenen Releases zur Verfügung. Sie müssen also nicht immer neu aus den Repositorys wie GitHub geladen werden, sondern können zum Beispiel alternativ von einem eigenen oder zumindest näher liegenden Proxy kommen. Über die Variable GOPROXY lässt sich eine kommaseparierte Liste von Proxys definieren, ein produktionsreifer wird mit https://proxy.golang.org durch Google zur Verfügung gestellt. Nun bestehen allerdings kommerzielle Projekte oft nicht nur aus offenen Modulen. Für diese existiert eine weitere Environment-Variable als Spiegel. Sie heißt GONOPROXY und enthält eine Liste der vom Proxy auszunehmenden Module.

Nun muss jedoch auch sichergestellt werden, dass die über einen Proxy geladenen Module nicht manipuliert worden. Hierfür lautet die Lösung Checksummen-Datenbank. Sie enthält die Hashes aller Module. Google stellt auch hier mit https://sum.golang.org von Haus aus zur Verfügung, eine Alternative kann über GOSUMDB mit Name, optionalem Public Key und dem Server-URL konfiguriert werden. Wie schon beim Proxy existiert auch hier eine Möglichkeit, Ausnahmen zu definieren. Der Name der Variablen lautet passend GONOSUMDB. Um es komfortabel zu machen, können die Ausnahmen für Proxy und Checksummen auch in nur einer Variable zusammen gefasst werden, der GOPRIVATE.

Passend zu der zur Verfügung gestellten Infrastruktur sowie den Mechanismen für den Umgang mit Modulen wurde auch die Arbeitsweise von go get erweitert. So get go get -u bei Updates schonender mit den Ressourcen um und aktualisiert nur importierte Module. Es gibt aber auch den Befehl go get -u all zur Aktualisierung aller Module. Ebenso lassen sich nun Versionsnummern jenseits des Semantic Versioning mit der Annotation +incompatible definieren und das require von Modulen mit Pseudoversionen kann auf den Git Hash reduziert werden.

Doch das go-Kommando hat noch mehr gelernt. go env kann nun auch benutzerspezifisch Standardwerte mit go env -w <NAME>=<VALUE> setzen. Und go build hat die Flags -o für die Ausgabe und -trimpath für die Entfernung der Systempfade erhalten. Das Flag -tags akzeptiert ab Go 1.13 seine List mit Kommata getrennt. Ein Blick in die inzwischen erlaubten Flags zeigt, wie sehr sich die Sprache beziehungsweise die Werkzeuge inzwischen von der Einfachheit zu Beginn entfernt hat. Eine Reduktion ist dafür die Entfernung des godoc Webservers – er steht ab sofort extern zur Verfügung – und die Änderung des Präfixes oder Exponents für binäre, hexadezimale, oktale und exponentielle Zahlen in Kleinschreibung.

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.

Zur Laufzeit

Wie bei jeder Version zuvor haben sich auch dieses mal wieder Laufzeitumgebungen verändert. So ist mit Go 1.13 der Native Client (NaCl) das letzte mal eine Zielplattform. Dafür werden auf dem PPC64 jetzt cgo und externes Linking unterstützt. Auch das frische Android Q ist bereits ein gültiges Ziel. Bei macOS wird nun 10.11 El Capitan und höher erwartet, bei FreeBSD 11.2 und höher. NetBSD und OpenBSD auf dem ARM64 sind nun ebenfalls neu unterstützte Plattformen, brandneu hinzugekommen ist das auf OpenSolaris basierende Illumos. Windows ist ja schon länger eine Plattform. Hier hat sich nun allerdings die Version der intern gelinkten Binarys geändert. War dies in Vergangenheit Windows NT 4.0, so ist es nun Windows 7.

Die Laufzeitumgebung hat auch einige Veränderungen erhalten. Etwas, was leicht passieren kann, ist der Zugriff auf ein Slice mit einem ungültigen Index. Die Fehlermeldungen haben bisher nicht immer geholfen. Nun jedoch wird der Panic mit dem Index und der Länge des Slice ausgegeben. Dies hilft bei der Fehlersuche. Ebenso wirken sich die Verbesserungen der Runtime auf die Ausführung des immer beliebten defer aus. In den meisten Fällen konnte die Performance hier um 30% verbessert werden. Ebenso wurde die Rückgabe von nicht mehr benötigtem Speicher an das Betriebssystem beschleunigt. So positiv dies ist, es liegt nun aber noch am Betriebssystem selbst, diesen nun wieder freien Speicher der eigenen Nutzung zuzuführen. Hier verhalten sich die Systeme unterschiedlich.

Sprachliches

Ganz entsprechend der Idee, die Sprache während der Version 1 nur sehr vorsichtig zu verändern, ist der Umfang hier sehr gering. Ein Anteil ist die Verbesserung der Lesbarkeit von numerischen Ausdrücken. So können beginnend mit dem neuen Release Binärzahlen direkt angegeben werden. Sie nutzen hierfür den Präfix 0b, wie zum Beispiel 0b10100111001 für die Zahl 1337. Nächstes Zahlensystem sind die oktalen Zahlen. Diese wurden bisher nur durch eine 0 eingeleitet. Dies ist auch weiterhin gültig, doch für eine Harmonisierung mit den anderen Darstellungen ist jetzt 0o der bevorzugte Präfix. Aus der dezimalen 1337 wird dann 0o2471. Der Präfix 0x ist ja bereits für hexadezimale Zahlen bekannt. Nun können auch Floating Points in hexadezimaler Notation angegeben werden. Hier wird der Präfix für die Mantisse eingesetzt, der Exponent mit p abgetrennt. Die Notation wirkt mit zum Beispiel 0x1.0p-0539 allerdings etwas eigenwillig.

Die Erweiterung beziehungsweise Harmonisierung der numerischen Notationen macht auch vor den imaginären Literalen für komplexe Zahlen keinen Halt. Der bekannte Suffix i kann nun für jeden binären, dezimalen oder hexadezimalen Integer oder Floating Point genutzt werden. Bleibt zu guter Letzt nur der Umgang mit großen numerischen Literalen. Sie dürfen nun den Unterstich (_) als Trenner zur Gruppierung von Ziffern. Integer im Millionenbereich werden so zum Beispiel zu 13_370_000, Binärzahlen zu 0b_0101_0011_1001 und auch mit Nachkommastellen ist dies in der Form 0.0000_1337 möglich.

Bei den Operatoren ist ab sofort der Shift Operator flexibler geworden. Bisher war die Anzahl der zu verschiebenden Stellen ein vorzeichenloser Integer. Nun darf dieser jedoch auch über ein Vorzeichen verfügen, was den Umgang den Variablen hierfür leichter macht. Für den Einsatz all dieser Änderungen sollte eine go.mod die Version 1.13 oder neuer enthalten. Dies kann direkt eingetragen oder via go mod edit -go=1.13 gesetzt werden.

Gang in die Bibliothek

Im Umfeld der Systemprogrammierung sind starke Crypto-Pakete Pflicht. So ist nun wie angekündigt TLS 1.3 Standard. Dies kann bei Bedarf jedoch mit dem Hinzufügen von tls13=0 in der Environment-Variablen GODEBUG wieder auf TLS 1.2 zurückgesetzt werden. Diese Möglichkeit wird es dann aber ab Go 1.14 nicht mehr geben. Ebenso ist SSLv3 abgekündigt und wird ab der 1.14 nicht mehr unterstützt. Weiter wurde das Package crypto/ed25519 hinzugefügt, es war bisher als golang.org/x-Package verfügbar. Die Schlüssel werden nun in TLS 1.2 und 1.3 sowie X.509 unterstützt.

Die Fehlerbehandlung ist in Go noch ein Punkt, der auch für Go 2 diskutiert wird. Ein erster Schritt in Richtung Zukunft ist das Standardpaket errors. Fehler könen ab Go 1.13 damit ineinander verschachtelt werden. Bieten sie eine Unwrap()-Methode, dann lässt sich der jew. Fehler wieder extrahieren. Hierfür kennt fmt.Errorf() ab sofort auch das Verb %w, welches die Einbettung eines übergebenen Fehlers auslöst. Mit errors.Unwrap(), errors.Is() und errors.As() lassen sich diese Fehler dann untersuchen und wieder auspacken. Dies erleichtert den Umgang mit Fehler-Stacks.

Weitere kleinere Verbesserungen finden sich in diversen Packages. So kann bytes Byte Slices auf gültige UTF-8-Sequenzen untersuchen und berichtigen lassen. Dies kann allerdings auch dafür sorgen, dass ungültige Sequenzen im Extremfall durch leere Sequenzen ersetzt werden. Ebenfalls Daten betreffend sind die neuen Typen NullTime und NullInt32 in database/sql für die jeweiligen Gegentypen, wenn diese null sind. Eine Form von Datenströmen sind auch Logdateien. Hier wurde das Package log um die Funktion Writer() ergänzt, sie gibt das aktuelle Ausgabeziel zurück. Und bei den Packages rund um Textformatierung, -konvertierung und -scanning werden die neuen Zahlenformate in Go 1.13 endlich korrekt verarbeitet.

Auch rund um das Netz gab es diverse Verbesserungen. So hat in net die ListenConfig das neue Feld KeepAlive vom Typ time.Duration. Es spezifiziert das Keep Alive des Listeners. Ähnlich wurden in net/http im Typ Transport die Felder WriteBufferSize und ReadBufferSize ergänzt. Wenn 0, dann beträgt ihr Standardwert 4 KB. Ebenso neu ist das Feld ForceAttemptHTTP2 für die Aktivierung für HTTP/2. Hier arbeitet das mit Go 1.11 eingeführte MaxConnsPerHost nun auch korrekt. Für die Behandlung der Templates in html/template werden nun zudem <SCRIPT type="module"> Tags als JavaScript Module Scripts interpretiert.

Neben weiteren Optimierungen im Package verfügt der Server nun über die Felder BaseContext und ConnContext für eine feinere Kontrolle. Auch die Funktion NewRequestWithContext() wurde hinzugefügt, um so die Lebensdauer des Requests besser zu kontrollieren. Der Typ Context greift zunehmend um sich. In dessen Package selbst wurde die Formatierung von Kontexten, die mit context.WithValue() zurückgegeben werden, verändert. Sie basiert nicht mehr auf fmt. Dies kann unter Umständen bestehende Software beeinflussen.

Rund um das Betriebssystem existiert ab Go 1.13 im Package os die neue Funktion UserConfigDir(). Sie liefert das Verzeichnis für benutzerspezifische Konfigurationen zurück, in dem der Anwender dann anwendungsspezifische Verzeichnisse hierfür anlegen sollte. Eine weitere Änderung ergibt sich unter Windows: Dort enthält das Environment für mit Cmd() ausgeführte Kommandos den geerbten Wert für %SYSTEMROOT%.

Performance ist ebenfalls immer ein wichtiges Thema. Hierfür wurden im Package sync die Mutexe um 10% beschleunigt, Once.Do() arbeitet doppelt so schnell wie zuvor. Auch der Pool wurde in Bezug auf die Garbage Collection optimiert.

Fazit: Rundes Ding

Was noch? Die Liste der Details ist lang. So gibt es unter anderem noch zahlreiche Änderungen in math, syscall, testing und time. Und auch in unicode, das nun Unicode 11.0 mit 684 neuen Zeichen enthält, darunter 7 Skripte und 66 Emojis. Also für jeden was dabei.

Es handelt sich bei Go 1.13 um ein rundes und behutsam verbessertes Release, Glück gehabt. Go verträgt die neue 13 gut und es ist das beste Release aller Zeiten – jedenfalls bis das neue Go 1.14 kommt. Revolutionäre Änderungen sind wie angekündigt hingegen erst mit Go 2 zu erwarten.

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: