Go 1.18: Go wird generisch

Mehr als eine Dekade nach der Veröffentlichung der Programmiersprache Go führt Version 1.18 Generics ein. Wir geben einen Einblick in die größte Sprachänderung seit Version 1.0.

Artikel von Tim Scheuermann veröffentlicht am
Go 1.18 bringt die größten Änderungen seit der ersten Version.
Go 1.18 bringt die größten Änderungen seit der ersten Version. (Bild: Martin Wolf / Golem.de)

Am 15. März 2022 ist Version 1.18 der Programmiersprache Go veröffentlicht worden. Trotz der unscheinbaren Nummer bringt sie eine der größten Änderungen an der Sprache seit Version 1.0.

Inhalt:
  1. Go 1.18: Go wird generisch
  2. Typ-Parameter in Go 1.18
  3. Go 1.18: Unser eigener Container

Neben den üblichen kleinen Verbesserungen und Fehlerbehebungen an Standardbibliothek, Tooling und Sprache packt das Go-Team dieses Mal zwei umfangreichere Erweiterungen ins Paket. Die kleinere der beiden Erweiterungen betrifft das Testen.

Erstmals unterstützt Go das Fuzzing von Out-of-the-box-Funktionen. Entwickler müssen sich nun nicht mehr auf externe Werkzeuge wie Go-fuzz verlassen, um den Code automatisiert auf Probleme bei der Überprüfung von Eingabedaten zu testen.

Die größere Erweiterung bringt Type Parameters in die Sprache. Type Parameters, nach dem Oberbegriff auch Generics genannt, ermöglichen es einer Funktion, nicht nur Variablen, sondern auch Typen als Parameter entgegenzunehmen. Dadurch können Funktionen ohne konkrete Typenangaben entwickelt werden, wenn diese für die Funktionalität nicht benötigt werden.

Stellenmarkt
  1. Mitarbeiter (m/w/d) IT Support
    Otto Krahn Group GmbH, Zülpich
  2. Spezialist (w/m/d) Conversational AI
    EnBW Energie Baden-Württemberg AG, Karlsruhe
Detailsuche

Trotz dieser signifikanten Änderungen bleibt Go weiterhin abwärtskompatibel; die Hauptversion erhöht nicht auf 2.

Hunderte Kommentare der Community berücksichtigt

Erste Konzepte für Typ-Parameter existieren seit 2011, bevor Go 1.0 veröffentlicht wurde. 2016 wurden die Pläne der Community vorgestellt und seitdem von Ian Lance Taylor, dem Autor des GCC-Go-Frontends und Google-Mitarbeiter, vorangetrieben.

In der Entwicklergemeinde wurde die Einführung kontrovers diskutiert. Generell fand sich zwar breite Unterstützung für Generics, die konkrete Syntax und der Funktionsumfang waren jedoch Teil langer Diskussionen. Insbesondere gab es Sorge über die erhöhte Komplexität der Sprache, die der einfachen Erlernbarkeit im Wege stehen könnte.

Der Kommentarfaden unter der ersten Vorstellung des Konzepts im August 2016 zieht sich über mehr als 800 Kommentare und fast sechs Jahre. Auf die akzeptierte Revision im Januar 2021 folgten noch einmal mehr als 400 Kommentare. Das Team nahm sich viel Zeit für die Verfeinerung des Konzepts. Die Änderungen wurden sorgfältig auf die bestehenden Konzepte abgestimmt und werden immer unter Berücksichtigung von Nutzer-Feedback entwickelt.

Prior art

Go baut mit der Einführung der Typ-Parameter und Constraints das bestehende Interface-Konzept aus. Interfaces beschreiben in Go eine Liste von Methoden, die ein Typ implementieren muss, um kompatibel zu sein.

  1. type ReadWriter interface {
  2. Read(p []byte) (int, error)
  3. Write(p []byte) (int, error)
  4. }

Alle Typen mit den entsprechenden Methoden implementieren das Interface automatisch. Neben dem Aufruf der Methoden ist aber kein Zugriff auf die Variable selbst vorgesehen. Die Interfaces wurden in Go immer als eine Art Generics-Lite behandelt. Viele Probleme, die klassischerweise mit Typ-Parametern gelöst werden, lassen sich auch durch geschicktes Anwenden der Interfaces lösen.

Bestes Beispiel ist das Interface aus dem Sort-Package. Statt dass der Sortieralgorithmus mit dem konkreten Listentyp umgehen können muss, bringen die Listen ihr Werkzeug selbst mit. Die drei benötigten Operationen - Len, um die Anzahl der Elemente zu bestimmen, Less, um zwei Elemente zu vergleichen, und Swap, um zwei Elemente auszutauschen - werden von der Liste implementiert. Der Rest des Algorithmus ist in der Sort-Funktion der Standardbibliothek hinterlegt.

Go - Das Praxisbuch: Einstieg in Go und das Go-Ökosystem

Dieser Ansatz funktioniert erstaunlich gut und ermöglicht das einfache Erweitern der Funktionalität. Soll die Liste stattdessen andersherum sortiert werden, so wird sie in ein sort.Reverse eingepackt, das lediglich den Rückgabewert der Less-Methode umdreht. Trotzdem muss für jeden Typ das Interface implementiert werden, was manchmal zu einigem Overhead führt.

Eine weitere Einschränkung verdirbt den Umgang mit Interfaces. Zwar lassen sich kompatible Typen einem Interface zuweisen, das funktioniert aber nicht bei Container-Typen wie Maps und Slices. Typ T mag zwar Interface I implementieren, eine Liste von T, []T, lässt sich aber nicht einer Liste von I, []I, zuweisen - eine Stolperfalle für Anfänger und Quell stetiger Frustration.

Zwei Welten

Go kennt bereits das Konzept der Typ-Parameter. Arrays, Slices, Maps und Channels werden alle schon heute mit ihnen initialisiert, Funktionen wie Len und Cap ermöglichen beliebige, kompatible Parameter.

Eigene Container lassen sich so aber nicht entwickeln. Entweder arbeitet man mit konkreten Datentypen, verliert also ein Stück Flexibilität, oder man lässt den konkreten Datentyp offen (durch das leere Interface interface{}) und verzichtet auf die Typenprüfung durch den Compiler.

Oft wurden beide Ansätze gemischt: Die Typen werden mit interface{} implementiert, Wrapper-Funktionen sorgen für die Umwandlung in die konkreten Datentypen.

Go 1.18 füllt diese Lücke.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
Typ-Parameter in Go 1.18 
  1. 1
  2. 2
  3. 3
  4.  


Keep The Focus 18. Mär 2022

magst du mal ein Beispiel geben?

Das... 17. Mär 2022

Das ein Extrem ist nicht wirklich besser als ein anderes ist, ist glaub jedem klar.



Aktuell auf der Startseite von Golem.de
Prehistoric Planet
Danke, Apple, für so grandiose Dinosaurier!

Musik von Hans Zimmer, dazu David Attenborough als Sprecher: Apples Prehistoric Planet hat einen Kindheitstraum zum Leben erweckt.
Ein IMHO von Marc Sauter

Prehistoric Planet: Danke, Apple, für so grandiose Dinosaurier!
Artikel
  1. Star Wars: Cal Kestis kämpft in Jedi Survivor weiter
    Star Wars
    Cal Kestis kämpft in Jedi Survivor weiter

    EA hat offiziell den Nachfolger zu Star Wars Jedi Fallen Order angekündigt. Hauptfigur ist erneut Cal Kestis mit seinem Roboterkumpel BD-1.

  2. Fahrgastverband Pro Bahn: Wo das 9-Euro-Ticket sicher gilt
    Fahrgastverband Pro Bahn
    Wo das 9-Euro-Ticket sicher gilt

    Die Farbe der Züge ist entscheidend, was bei der Reiseplanung in der Deutsche-Bahn-App wenig nützt. Dafür laufen Fahrscheinkontrollen ins Leere.

  3. Retro Gaming: Wie man einen Emulator programmiert
    Retro Gaming
    Wie man einen Emulator programmiert

    Warum nicht mal selbst einen Emulator programmieren? Das ist lehrreich und macht Spaß - wenn er funktioniert. Wie es geht, zeigen wir am Gameboy.
    Von Johannes Hiltscher

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • PS5 evtl. bestellbar • Prime Video: Filme leihen für 0,99€ • Gigabyte RTX 3080 12GB günstig wie nie: 1.024€ • MSI Gaming-Monitor 32" 4K günstig wie nie: 999€ • Mindstar (u. a. AMD Ryzen 5 5600 179€, Palit RTX 3070 GamingPro 669€) • Days of Play (u. a. PS5-Controller 49,99€) [Werbung]
    •  /