Eine runde Nummer

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

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.

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.

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.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -