Atem anhalten und langsam bis 2 zählen...

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

Frank Müller

© 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.

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

avatar
4000
  Subscribe  
Benachrichtige mich zu: