Go 1.10 bringt viele Verbesserungen für Packages, Tools und Laufzeitsysteme

© Reneé French (CC BY 3.0 DE / modifiziert)
Im gewohnten Rhythmus haben die Entwickler von Google die neue Version ihrer Sprache Go herausgegeben. Das aktuellste Release trägt den Namen Go 1.10. Die enthaltenen Veränderungen entsprechen der Konvention, Versionen mit der gleichen Hauptversionsnummer in der Sprache kompatibel zu halten. Erneuerungen berühren in der Regel mehr die Laufzeitumgebungen sowie die Bibliotheken.
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.10 weiterhin kompilieren und betreiben lassen wie bisher. Die aktuelle Version ist das elfte Release des 1.Xer Release-Zyklus‘ von Go.
Go 1.10: Neue Sprachfeatures
In der Sprache selbst gibt es nur zwei minimale Erweiterungen. Einerseits sind Shifts durch nicht typisierte Konstanten nun besser definiert und damit Index-Ausdrücke der Form bs := []byte{0, 1, 2, 3, 4}
und bs[1.0 << 2]
erlaubt, Ergebnis ist die 4. Auch die Grammatik der Methodenausdrücke ist nun etwas flexibler und erlaubt einen Typenausdruck mit eingebettetem Typ, von dem eine Methode unmittelbar aufgerufen werden kann. Macht im Quelltext quasi keinen Sinn, erweitert die Sprachgrammatik um einen Ausdruck, den der Compiler bereits zuvor akzeptierte.
Packages, Packages, Packages
In der Standardbibliothek gab es nur wenige und wie bereits erwähnt kompatible Änderungen. So hat archive/tar
Erweiterungen und Verbesserungen in der Behandlung spezieller Header erhalten. Ebenso wurde archive/zip
in der Kodierung der Zeiten und Zeichensätze erweitert. Im Package bufio
haben die Typen Reader
und Writer
die neue Methode Size()
erhalten. Sie geben die Größen der unterliegenden Puffer zurück. In bytes
wurde ein Risiko minimiert. Die Funkionen Fields()
, FieldsFunc()
, Split()
und SplitAfter()
geben schon immer Subslices zurück. Ein append()
kann hier zu einem Überschreiben der Daten führen. Daher wird nun auch immer eine Capacity passend zur Länge gesetzt.
Kryptographie & Kodierung
Kryptographie ist ein weiterer wichtiger Block. In crypto/cipher
können fehlerhafte Initialisierungsvektoren in NewOFB()
zu einer Panic führen, wie es auch die anderen Funktionen in dem Package tun. Die Änderung in crypto/tls
ist klein, aber wichtig. SHA-512 wurde bei TLS 1.2 zwar schon länger unterstützt, was aber Clients nicht immer genutzt haben. Ein explizites Advertisement ändert dies. Das Package crypto/x509
hat diverse Erweiterungen erhalten. Sei es die Verifikation von Zertifikaten, die Konvertierung zwischen RSA und PKCS#1 sowie die Konvertierung nach PKCS#8.
Go bietet viele Packages für Kodierungen. encoding/asn1
nutzt nun im Marshalling UTF8String
als Typ und geht wie auch das Unmarshalling auf weitere Field Tags ein. In encoding/csv
ist nun der Reader
flexibler geworden und in encoding/hex
liefern die neuen Funktionen NewEncoder()
und NewDecoder()
ab sofort Umwandler im Stream zurück, ein netter Komfort. Eine weitere Kodierung ist JSON. In encoding/json
kann der Decoder
nun strikter arbeiten und unbekannte Felder nicht mehr wie bisher ignorieren. Stattdessen wird dann ein Fehler zurückgegeben. Ein behobener Fehler in der Reflection hat auch seine Auswirkung auf Unmarshal()
im JSON-Package.
Das Decoding in Felder privater durch Pointer referenzierte Structs, die über einen Pointer referenziert werden, ist nicht mehr möglich und führt zu einem Fehler. In Go 1.10 behandelt encoding/pem
Blöcke, die nicht als PEM kodiert werden können, nicht mehr mit einer teilweisen Ausgabe, was ein saubereres Verhalten ist. Das letzte Encoding-Package encoding/xml
hat als Erweiterung die Funktion NewTokenDecoder()
erhalten, welche von einem TokenReader
statt aus einem Byte Stream liest.

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:
- Frank Müller: Go 1.10 bringt viele Verbesserungen für Packages, Tools und Laufzeitsysteme
- Christoph Engelbert: 5 Dinge, die man an Go hassen kann (aber nicht muss)
- Frank Müller: Die Golumne: Go – die C-volution von Google
- Ralf Wirdemann: Schnittstellen leicht gemacht – RESTful APIs in Go
- Tim Scheuermann: Go Infografik: Die wichtigsten Sprachkonstrukte auf einen Blick
- Dominik Mohilo: Markenidentität von Go definiert: Logo, Style-Guide & Präsentationsvorlagen
- Marcel Richters: Google veröffentlicht Umfrageergebnisse zu Programmiersprache Go
Happy Gophing!
Netzwerk & Kommandozeilen
Die Behandlung von Kommandozeilen via flag
ist ebenfalls reifer geworden. Die Ausgabe kann stärker beeinflusst werden und stellt sich schöner dar. Typen, die hash.Hash
implementieren, wird in der neuen Version von Go auch encoding.BinaryMarshaler
und encoding.BinaryUnmarshaler
angeraten, wie es bereits diverse Implementierungen in der Standardbibliothek machen. So kann der interne Zustand gesichert und wieder hergestellt werden. Im Bereich der mathematischen Packages gab es ebenfalls mehrere Erweiterungen.
Ein wichtiger Block sind immer die Packages rund um das Netzwerk. Fixes, Erweiterungen für mehr Kontrolle und Implementierungen für Windows sind im Package net
enthalten. Der FileServer
wurde reifer und der ResponseWriter
reagiert panischer auf ungültige Status Codes. In net/textproto
wurde ReadMIMEHeader()
weniger tolerant gegenüber einem fehlerhaften Header gestaltet, in net/url
arbeitet ResolveReference()
bei der Behandlung von Slashes jetzt passend zu RfC 3986. Diese Änderung kann zuvor fehlerhaft arbeitende Programme brechen, was aber hoffentlich im Unit-Test auffällt. Dazu kommen noch viele kleine Änderungen mehr in den net
Packages.
Abschließend gab es auch in den Packages os
, reflect
, strconv
, time
und unicode
Änderungen. Letzteres fügt im Rahmen von Unicode 10.0 8518 neue Zeichen hinzu, darunter auch das Bitcoin Währungssymbol und 56 neue Emojis.
Lesen Sie auch: Go – wie Googles C-Alternative funktioniert und wofür man sie einsetzt
Plattformen
In Sachen unterstützte Plattformen sind einige ältere entfernt worden, neue wurden hingegen Voraussetzung. Bei FreeBSD wurde 9.3 entfernt, 10.3 und später ist nun Pflicht. Auch NetBSD wird wieder unterstützt, jedoch lediglich das noch nicht freigegebene NetBSD 8. Beim OpenBSD unterstützt Go 1.10 noch die Version 6.0, 1.11 wird hingegen die 6.2 voraussetzen.
Ähnlich ist es mit OS X 10.8 und 10.9. Go 1.11 wird mindestens OS X 10.10 erwarten. Bei Windows sind es XP und Vista, die noch unterstützt werden, mit Go 1.11 wird es hier mindestens Windows 7 sein, das zur Arbeit mit Googles C-Alternative benötigt werden wird.
Werkzeuge und Laufzeitsystem
Auch hier gab es Änderungen im Verhalten bzw. den Tools selbst. So zum Beispiel die Verhaltensweise, wenn $GOROOT
nicht gesetzt wurde oder die optionale Nutzung eines $GOTMPDIR
. go build
stellt mit Version 1.10 intelligenter fest, was erneut übersetzt werden muss, pflegt einen Cache und Flags werden gezielten auf aufgeführte Packages angewandt. Auch go install
kann nun gezielter auf Package-Ebene arbeiten.
Gecached werden in 1.10 auch Tests, allerdings nur erfolgreiche. Zudem wird beim Test go vet
vorangestellt, um Probleme bereits hier aufzudecken. Für die Interaktion mit C hat sich an Cgo einiges getan, go doc
zeigt zurückgegebene Slices eines Types mit bei einer einfachen Konstruktorfunktion an und nicht mehr nur in der Übersicht des Packages. Auch die Tools rund um Profiling und Diagnose sind reifer geworden und helfen bei der Entwicklung robuster und performanter Systeme.
Das Laufzeitsystem von Go ist wie immer etwas schneller geworden. Dies ist größtenteils dem verbesserten Garbage Collector zu verdanken.
Fazit
Die Google-Truppe bleibt ihrem Motto treu. Go wurde als einfaches und geradliniges Entwicklungswerkzeug entworfen, die Releases seit der Veröffentlichung sollen sich auf eine stete Verbesserung konzentrieren – dies gelingt wunderbar. Keine Featurevielfalt mit jedem Release, keine esoterischen Spracherweiterungen. Dafür in der Regel die Möglichkeit, sorgenfrei auf die jeweils neueste Version zu aktualisieren und von den Verbesserungen zu profitieren.
Hinterlasse einen Kommentar