Noch keine Generics

Golumne Spezial: Go 1.15 ist da – Minimalinvasive Verbesserungen

Frank Müller

© Reneé French (CC BY 3.0 DE) ©SuS Media

Go 2 ist bereits länger ein Thema und wird es auch wohl noch bleiben. Das Team hat versprochen, mit Änderungen am Sprachstandard sehr vorsichtig umzugehen. Hieran halten sie sich, was sie aber nicht von der Pflege der Tools, der Laufzeitumgebung und der Bibliotheken abhält. So auch jetzt mit der frisch freigegebenen Version 1.15, wie immer nach 6 Monaten.

Auch Go 1.15 beinhaltet keine Änderung am Sprachstandard. Generics und veränderte Fehlerbehandlung sind noch in der Diskussion. Wie wichtig dies ist, das zeigen die vielen unterschiedlichen Meinungen und Vorschläge dazu. Doch hierauf dürfen wir noch etwas warten. Erst geht es wie gewohnt robust mit Verbesserungen weiter.

Werkzeuge

Dreh- und Angelpunkt ist das go-Kommando. Neben den Unterkommandos wird die Arbeitsweise durch Flags und Environment-Variablen gesteuert. Bei den Modulen ist GOPROXY für das Laden vorkompilierter Module hinzu gekommen. Mehrere URLs können nun mit Kommata oder Pipe-Zeichen angegeben werden. Liefert nun ein Proxy-Server ein 404 oder ein 410 als Return-Code, so wird der folgende mit Komma separierte URL probiert. Bei einem Pipe-Zeichen erfolgt dies hingegen bei jedem Fehler. Der Standard-Proxy bleibt https://proxy.golang.org,direct.

Fehler bei der Verarbeitung von Flags wurden bereinigt, ebenso die Nutzung der Variablen GOFLAGS. Die neue Variable GOMODCACHE kann nun einen alternativen Modul-Cache als den Standard GOPATH[0]/pkg/mod definierten. Unter Windows ist zudem ein Workaround für Zugriffsprobleme auf den Cache hinzu gekommen. Er muss explizit mit GODEBUG=modcacheunzipinplace=1 aktiviert werden.

go vet gibt nun eine Warnung bei string(x) aus, wenn es sich bei x um einen anderen Integer-Typ als byte oder rune handelt. Ebenso werden Warnungen ausgegeben, wenn Assertions von Interfaces auf andere Interfaces nie aufgehen können. Dies wird bei go test nun auch immer ausgegeben. Zukünftig könnte es diese Prüfung grundsätzlich geben, was jedoch nicht rückwärtskompatibel wäre. Daher erst mal in Form dieser vorsichtigen Einführung.

Panics mit abgeleiteten boolschen oder numerischen Typen geben nun nicht mehr die Speicheradresse sondern den Wert aus. Dies macht die Interpretation der Ausgabe leichter. Ebenso ist die Behandlung von Kill-Signalen, welche nicht durch os/signal.Notify behandelt werden, nun verlässlicher in der Ausgabe eines Stack Traces. Positiv ist ebenfalls, dass die Performance der Laufzeitumgebung noch mal verbessert wurde. Die erzeugten Binarys sind nun im Vergleich zu Go 1.14 etwa 5% kleiner. Der Linker ist in Go 1.15 in etwa 20% schneller und verbraucht 30% weniger Speicher für auf ELF basierende Betriebssysteme unter amd64. Doch auch die weiteren Kombinationen wurden optimiert, nur halt nicht so effizient.

Bibliothek

Ein neues Package der Version 1.15 ist time/tzdata. Damit kann die Timezone-Datenbank in ein Programm integriert werden. Nach einem Import muss das lokale System nicht über die Timezone-Datenbank verfügen. Allerdings vergrößert dies das Binary um 800 KB.

Eine weitere wichtige Änderung betrifft die veraltete Behandlung des CommonName-Felds in X.509-Zertifikaten. Sie wurden als Hostnames behandelt, wenn keine Subject Alternative Names definiert waren. Doch dies ist nun deaktiviert und kann – temporär – mit GODEBUG=x509ignoreCN=0 bei Bedarf aktiviert werden.

Weitere Package-Änderungen betreffen bufio, wo der Scanner bei einer ungültigen io.Reader-Rückgabe keine Panic mehr auslöst. Vielmehr wird nun der Fehler ErrBadReadCount zurückgegeben. Die crypto-Packages haben im Einsatzgebiet von Go eine sehr wichtige Bedeutung. Und so wurden diese auch in der neuen Version stark gepflegt. Equal-Methoden, die Implementierung von fmt.Stringer, die Generierung von Signaturen, erweitertes Marshalling, die Verifikation und der neue Typ Dialer in crypto/tls. Datenbank-Pools erlauben das Schließen von Verbindungen, wenn sie im Pool länger als eine definierte Zeit im Leerlauf verweilen. Ein vielfach genutztes Packages ist auch encoding/json. Hier gibt es intern im Decoding ein Limit der Tiefe, um Panics durch hohen Stack-Verbrauch zu vermeiden. fmt kennt neue Verben für Floating Points, TempDir und TempFile in io/ioutil sind nun bezüglich von Pfadseparatoren restriktiver.

Im Netzwerkbereich gibt ein durch Conn.SetDeadline definierter Timeout nun ein os.ErrDeadlineExceeded zurück und in net/http ist das Parsing zur Vermeidung von Angriffen nun strikter. Auch die weiteren Netzwerk-Packages wurden weiter gepflegt. Das Timeout-Verhalten im Netzwerk findet sich auch im os-Package wieder.

Auch wenn es widersprüchlich klingt, wurden die Sicherheitsregeln des Packages unsafe verbessert. Auch reflect wurde eingeschränkt, Methoden nicht exportierter Felder können nicht mehr ausgeführt werden.

Die bisher etwas nachlässig behandelten komplexen Zahlentypen haben nun eine Unterstützung im Package strconv erlangt. Es umfasst nun die Funktionen FormatComplex und ParseComplex. Im Package sync wird das Verhalten der Map verbessert. Delete arbeitet nun schneller, hinzu kommt LoadAndDelet` für ein Löschen zusammen mit der Rückgabe des bis dahin vorhandenen Werts. Hinzu kommen noch eine Vielzahl weiterer Verbesserungen und Erweiterungen der unterschiedlichen Packages.

Unterstützte Plattformen

Auch der Markt der Rechner und Betriebssysteme verändert sich stetig, seien es Befehlssätze oder Busbreiten. Sei es, dass unter Darwin nur mehr macOS 10.12 und neuer sowie 64-Bit unterstützt werden, oder Windows-Binarys im ASLR-Modus sowie mit Details zu unsafe.Pointer. Unter Android wird der lld-Linker genutzt, unter OpenBSD wird die Version 6.7 mit arm und amd64 als Architekturen unterstützt. Die Unterstützung von Linux auf RISC-V wurde bezüglich Stabilität und Performance verbessert und unter 386 ist Go 1.15 die letzte Version mit x87 Floating Point Hardware. Zukünftig ist SSE2 erforderlich.

Fazit

Wie üblich ist auch Go 1.15 keine umwerfende Neuerung. Aber sie ist eine der stetigen Verbesserungen bei großer Konstanz. Dies ist es, was die Nutzer von Go so schätzen. Der Umstieg von 1.14 auf die 1.15 wird nur in Ausnahmefällen Aufwände mit sich bringen, doch sie bringt eine erweiterte Funktionalität bei höherer Geschwindigkeit und verbesserter Robustheit mit sich.

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: