zurück
#go #generics #programming #development #ai-dev 1 min

Go Generics: Ein Sprung für Sprache und Community

Erfahren Sie, wie Go Generics die Code-Qualität, Sicherheit und Performance verbessern und die Entwicklung revolutionieren.

English version available — read in English.

Vor Go 1.18 war die Arbeit mit wiederverwendbarem Code, der verschiedene Datentypen verarbeiten musste, ein Kompromiss. interface{} bot Flexibilität, aber auf Kosten der Typsicherheit zur Laufzeit. Type-Assertions waren nötig und konnten zu Panics führen. Das machte Code fehleranfälliger und schwieriger zu warten. Bibliotheken wie Collections oder Serializer litten darunter.

Generische Methoden sind mehr als nur “Syntaxzucker”. Sie ermöglichen Funktionen und Methoden, die über eine Menge von Typen arbeiten, ohne interface{}. Der Go-Compiler prüft Typen zur Kompilierzeit. Das eliminiert Laufzeitfehler durch falsche Typen. Der Code wird lesbarer, da die Absicht klarer ist. Die Performance profitiert, da keine dynamischen Type-Assertions oder Boxing/Unboxing nötig sind.

Die Auswirkungen auf die Go-Community sind spürbar. Neue Bibliotheken entstehen, die Generics nutzen. Standardbibliotheken werden refaktorisiert. Das erleichtert das Schreiben robuster und performanter Software. Entwickler müssen weniger Boilerplate-Code für verschiedene Typen schreiben. Stattdessen können sie sich auf die Kernlogik konzentrieren. Bibliotheken für Datenstrukturen, Algorithmen oder Datenbank-Abstraktionen werden dadurch attraktiver und einfacher nutzbar.

Ein Beispiel: Eine generische Min-Funktion, die den kleinsten Wert aus einer Slice von Zahlen zurückgibt. Vor Generics: eine Funktion für int, eine für float64 etc., oder eine mit interface{} und Type-Assertions. Mit Generics:

package main

import "fmt"

func Min[T interface{ ~int | ~float64 }](a, b T) T {
  if a < b {
    return a
  }
  return b
}

func main() {
  fmt.Println(Min(10, 5))
  fmt.Println(Min(3.14, 2.71))
}

Dieser Code ist kürzer und typsicher. Der Compiler stellt sicher, dass Min nur mit Typen aufgerufen wird, die die Constraints erfüllen. Das steigert die Produktivität und Code-Qualität. Performance-Vorteile entstehen, weil der Compiler optimierte native Code-Pfade für spezifische Typen generieren kann, statt auf generische Laufzeit-Mechanismen angewiesen zu sein.