Suche
Time to Go!

Go 1.9 bringt Type Aliases & paralleles Kompilieren von Funktionen

Dominik Mohilo

© Takuya Ueda (CC BY 3.0)

Mit der geringfügigen Verspätung von einer Woche veröffentlichte Google mit Go 1.9 die aktuellste Version seiner C-Alternative. Neben der Einführung von Typaliasen ist eine kleine Änderung der Sprachspezifikation das einzig Neue in Bezug auf die Sprache. Doch in anderen Bereichen wie dem Tooling, der Runtime und den Bibliotheken wurden intensivere Arbeiten vorgenommen.

Eines vorweg: Google hält sich nach wie vor an sein Kompatibilitätsversprechen. Entwickler können sich also weiterhin darauf verlassen, dass sich ihre Go-Anwendungen auch nach dem Update auf Go 1.9 weiterhin kompilieren und betreiben lassen wie bisher. Die aktuelle Version ist das zehnte Release des 1.Xer Release-Zyklus‘ von Go.

Go 1.9: Neue Sprachfeatures

An der Sprache selbst hat Google – man kann mittlerweile sagen traditionell – kaum Änderungen eingeführt. Vielleicht hebt sich der Suchmaschinenriese tiefgreifendere Änderungen auch für den nächsten großen Meilenstein, also Go 2.0, auf. Highlight im Hinblick auf die Sprache selbst sind in Go 1.9 sicher die neuen Typaliase, durch deren Implementierung die graduelle Quelltextkorrektur während des Verschiebens von Typen zwischen Paketen möglich wird. Eine mögliche Deklaration könnte in etwa so aussehen:

type T1 = T2

Durch diese Deklaration wird ein Alias für T2 eingeführt (nämlich T1). Somit wird mit T1 und T2 der gleiche Typ angesprochen. Gerade so, wie byte auch schon immer ein Alias für uint8 war. Wer eine detailliertere Erklärung hierfür benötigt, findet weitere Informationen im Type Alias Design Document auf GitHub und in diesem Artikel von Russ Cox zum Code Refactoring.

Die Sprachspezifikation gibt nun klar an, wann Implementierungen gestattet ist, Floating Point Operations verschmelzen zu lassen. Dazu können sie zum Beispiel die Instruktion fused multiply and add (FMA) nutzen, um x * y + z zu berechnen, ohne das Zwischenergenis von x * y zu runden. Will man das Zwischenergebnis allerdings doch gerundet haben, wird der Befehl float64(x*y) + z gebraucht.

Überarbeitung der Tools in Go 1.9

Wie bereits in unserer Vorschau berichtet, unterstützt der Go Compiler ab sofort das parallele Kompilieren der Funktionen eines Pakets. Durch diese Änderung wird jetzt die Macht mehrerer Rechenkerne genutzt, die bereits beim parallelen Kompilieren separater Pakete zum Einsatz kommt. Wer lieber auf dieses Feature verzichtet, kann einfach der Variable GO19CONCURRENTCOMPILATION den Wert 0 zuweisen.

Eine oft gewünschte Änderung bezieht sich auf das Vendor Matching: Mit dem Befehl ./... ist es Tools, die Paketnamen akzeptieren, nicht mehr möglich, Pakete innerhalb von vendor-Verzeichnissen aufeinander abzustimmen. Die Funktion wird zukünftig über den Befehl ./vendor/... verfügbar sein.

Im Bereich ENV können sich Nutzer von JSON über die neue Flag go env –json freuen, die einen JSON-Output ermöglicht. Dieses ersetzt das betriebssystemspezifische Output-Format. Das Kommando go test hat ebenfalls eine neue Flag, nämlich -list. Diese nutzt einen regulären Ausdruck als Parameter und gibt in stdout die Namen sämtlicher Tests, Benchmarks und Beispiele aus, ohne sie tatsächlich auszuführen.

Bibliothek und Performance

Das Paket math/bits, das mit Go 1.9 veröffentlicht wurde, bringt optimierte Implementierungen, um Bits zu editieren. Die Funktionen innerhalb dieses Pakets werden von den Compilern der meisten Architekturen zusätzlich erkannt und für eine bessere Performance wie intrinsische Funktionen behandelt.

Ein neuer Map-Typ wurde dem sync-Paket hinzugefügt, der allerdings kein genereller Ersatz für den eigenen Map-Typ der Sprache ist. Das Paket time trackt unterdessen ab Go 1.9 transparent die gleichbleibende Zeit in jedem Time-Wert, die Berechnung der Zeitspanne zwischen zwei Time-Werten soll dadurch sicherer werden.

Im testing-Paket wurde sowohl testing.T als auch testing.B die neue Methode Helper hinzugefügt. Die beiden neuen Methoden (*T).Helper und (*B).Helper kennzeichnen die Call-Funktion als eine Test-Helper-Funktion. Beim Ausgeben von Datei- oder Zeileninformationen durch das testing-Paket wird ab sofort der Ort des Aufrufs einer Helper-Funktion angezeigt. Ein Beispiel:

package p

import "testing"

func failure(t *testing.T) {
    t.Helper() // This call silences this function in error reports.
    t.Fatal("failure")
}

func Test(t *testing.T) {
    failure(t)
}

Da failure sich selbst als Test-Helper identifiziert, wird die Fehlermeldung, die während dem Test ausgegeben wird, auf Zeile 11 verweisen, von dort wird nämlich failure aufgerufen.

Neben den vielen Änderungen in der Core Library wurde auch der Garbage Collector noch einmal aufgebohrt und überarbeitet. Funktionen der Bibliothek, die zuvor die Stop-the-World Garbage Collection triggerten, rufen jetzt die nebenläufige Garbage Collection auf.

Weitere Informationen zu Go 1.9 gibt es in der offiziellen Ankündigung auf dem Blog von Go, detaillierte Erklärungen zu sämtlichen Änderungen, die für die neue Version durchgeführt wurden, finden sich in den Release Notes. Herunterladen kann man das Update über die Downloadseite.

PS: Wer sich gerade in San Francisco aufhält, möchte vielleicht auf die dortige Go Release Party gehen. Alle Infos dazu gibt es auf Meetup.

Geschrieben von
Dominik Mohilo
Dominik Mohilo
Dominik Mohilo studierte Germanistik und Soziologie an der Goethe-Universität in Frankfurt. Seit 2015 ist er Redakteur bei S&S-Media.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.