Golumne Spezial: Go 1.14 ist da – Das beste Release ever

© Reneé French (CC BY 3.0 DE) ©SuS Media
Gerade erst den 10. Geburtstag hinter sich gebracht, erscheint im bekannten Rhythmus ein neues Release der Sprache Go. Während die Hauptversion weiterhin die Nummer 1 trägt, um das Halten des Sprachstandards zu dokumentieren, erreicht der Gopher nun die Unterversion 14. Und wie bereits zuvor, enthält sie so einige kleine aber feine Verbesserungen. Diese tragen zur Reife der Sprache bei.
Die Programmiersprache Go kann, beziehungsweise sie darf sich noch nicht großartig ändern. Dies bleibt der Version 2 vorbehalten. Doch eine kleine Erweiterung gab es schon. Es sind die überlappenden Einbettungen von Interfaces mit Methoden gleicher Signaturen. Ein schönes Beispiel sind hier io.ReadCloser
und io.WriteCloser
. Ersteres besteht heute aus io.Reader
und io.Closer
, letzteres aus io.Writer
sowie io.Closer
. Ein direktes gemeinsames Embedding in io.ReadWriteCloser
in der Form
type ReadWriteCloser interface { ReadCloser WriteCloser }
war bisher wegen der doppelten Einbettung der Methode Close() error
nicht gestattet. Der Kunstgriff ging bis heute über eine Kombination der drei Interfaces io.Reader
, io.Writer
und io.Closer
. Mit Go 1.14 ist aber auch mehrfaches Embedding von Methoden mit gleichen Signaturen erlaubt, ändert es ja auch nichts an der nur einmaligen Implementierung. Mehrfach gleichnamiges Einbetten mit unterschiedlichen Signaturen führt jedoch verständlicherweise weiterhin zu einem Compiler-Fehler.
Standardbibliothek in Go 1.14
Wie bei jeder neuen Version wurde auch dieses mal die Standardbibliothek um neue Funktionalität erweitert bzw. die bestehende verbessert. Darunter ist auch ein komplett neues Package, ein weiteres Hashing. So lassen sich mit hash/maphash
beliebige Strings oder Byte-Slices kollisionsfrei auf uint64
-Werte abbilden. Innerhalb eines Prozesses ist dieses Mapping stabil, jedoch nicht über Programmstarts hinweg. Das Package ist für Hashtables oder vergleichbare Datenstrukturen gedacht.
Weitere neue Packages enthält das Update nicht. Dafür wurden jedoch verschiedene bereits vorhandene Packages gepflegt. Ein Blick auf Änderungen an den Paketen crypto/tls
und crypto/x509
zeigt, wie wichtig diese für den Einsatz von Go in moderner verteilter Software genommen wird. Ebenso wurde das für die Nutzung in Netzwerken und in der Telekommunikation wichtige Encoding erweitert. Im Package ASN.1
wird mit diesem Release der Typ BMPString
unterstützt, im Package JSON
steht im Decoder nun die Abfrage des Input-Offsets zur Verfügung und kleinere Fehler wurden korrigiert.
Praktisch für die saubere Behandlung temporärer Dateien ist eine kleine Änderung in io/ioutil
. Wie TempFile
unterstützt nun auch TempDir
die Arbeit mit selbstbestimmten Präfixen und Suffixen. Enthält das Namensmuster einen Stern, so wird dieser durch eine zufällige Zeichenkette ersetzt. Eine kleine Erweiterung hat das math
-Package erhalten. Die Funktion FMA()
macht eigentlich nichts anderes, als die Berechnung von x * y + z
, dies jedoch in einer für unterschiedliche Architekturen optimierte Form. Ein Blick in die Implementierung der Funktion ist sehr interessant. Daneben wurden auch die Pakete math/big
und math/bits
erweitert, letztere beinhaltet nun Funktionen für die Ermittlung von Remaindern.
Gepflegte Packages und neue Emojis
Im Bereich der Netzwerke wurde das Package net/http
gepflegt. So können nun alle Header-Werte mit einem kanonischen Schlüssel ausgelesen werden, für TLS-Verbindungen lässt sich eine optionale Dialer-Funktion setzen und unter Windows verarbeitet ServeFile
nun Dateien größer als 2GB korrekt. In net/http/httptest
wird nun der Test von HTTP/2 unterstützt und auch net/textproto
wurde wie schon HTTP um die Funktion Values()
im MIMEHeader
erweitert.
Dazu kommen diverse weitere kleine Änderungen und Korrekturen. Sei es, dass ein runtime.Goexit()
nicht mehr durch ein rekursives panic/recover
unterbrochen werden kann und strconv
nun im NumError
die Ursache enthält. Damit wird ab sofort auch errors.Is()
unterstützt und die Prüfung auf strconv.ErrRange
oder strconv.ErrSyntax
ist möglich. Für die Performance ist es sehr gut, dass das Unlocking einer Mutex nun direkt die CPU der nächsten wartenden Goroutine aktiviert. Bei Mutexen unter starker Belastung führt dies zu signifikanten Gewinnen. Und ein ebenso regelmäßig erweitertes Package ist unicode
. Es wird nun Unicode 12.0 mit 554 weiteren Zeichen, vier Schriftsystemen und 61 Emojis unterstützt.
Runtime, Platforms, Tools
Ebenso wichtig wie die Sprache und ihre Bibliotheken ist die Laufzeitumgebung. Hier hat zum Beispiel das bisher in kritischen Situationen als Bremse geltende defer
eine spürbare Beschleunigung erhalten, der Overhead geht nun gegen null. Goroutinen sind jetzt asynchron austauschbar, was bei Schleifen ohne Funktionen Deadlocks in der Verteilung oder Verzögerungen in der Garbage Collection vermeidet. Weitere Faktoren zur Beschleunigung sind die effizientere Page Allocation, welche bei einem großen Wert für GOMAXPROCS
die aufkommenden Sperren vermindert, sowie die Verbesserung der internen Timer.
Aus Sicht der Plattformen definiert die neue Version wieder den auslaufenden Support für alte Plattformen. Unter Darwin wird die 1.14 das letzte Release für macOS 10.11, 1.15 wird dann schon 10.12 voraussetzen. Ebenso wird die neue Version die letzte mit Support von 32-bit Binaries auf macOS, iOS, iPadOS und tvOS sein. WebAssembly hat als Port Veränderungen in js.Value
erhalten, FreeBSD unterstützt nun die ARM-Architektur unter FreeBSD 12.0 und höher, RISC-V wurde experimentell für 64-bit Linux hinzugefügt und wie angekündigt wird nacl
mit dieser Version nicht mehr unterstützt.
Bleiben noch die Tools. Wichtig ist, dass mit Go 1.14 Module nun endgültig produktionsreif sind und das Team die Portierung eigener Bibliotheken auf Module anregt. Für Module und Vendoring wurden auch neue Flags für die Behandlung von go.mod
, Cache und Module Vendoring hinzugefügt. Die neue Environment-Variable GOINSECURE
erlaubt nun auch den Bezug von Modulen ohne HTTPS mit Zertifikat. Und mit der neuen Version wird auch Subversion als Repository für Module unterstützt, ist es doch in manchen Unternehmen noch im Einsatz. Last but not least eine praktische Kleinigkeit beim Testen. Ausgaben von t.Log
werden nun beim Start mit go test -v
kontinuierlich ausgegeben, nicht mehr erst am Ende des Tests. So lassen sich gerade größere Tests während der Entwicklung besser beobachten.
„The best release ever“
Die Zwischenüberschrift ist ein unter Gophern gängiger Spruch für jede neue Version der Sprache. Und sie trifft immer zu, so auch dieses Mal. Keine Revolution, nein, ist dies doch mit der Beibehaltung der Hauptversion versprochen und auch heute wieder eingehalten. Dafür jedoch mit einer sorgsamen Pflege dessen, was der Entwicklerin zur Verfügung steht und worauf sie aufbauen kann. So wird Go weiter eine gute Basis für Cloud Native Solutions, skalierbare Anwendungen und Microservices sein.
Hinterlasse einen Kommentar