0Pricing
Go Academy · Lektion

Generics in der Praxis: Fallstricke

Wann Sie Generics verwenden sollten und welche Fehler häufig auftreten

Generics in der Praxis: Fallstricke ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Übermäßige Verwendung von Generics

Nicht jede Funktion muss generisch sein. Wenn immer nur ein konkreter Typ verwendet wird, erhöht ein generischer Typ die Komplexität ohne Nutzen. Bevorzugen Sie konkrete Typen und refaktorisieren Sie zu Generics, sobald Duplikation entsteht.

Type Assertion innerhalb von Generics

Sie können innerhalb einer generischen Funktion keine Type Assertion oder keinen Type-Switch auf dem Typparameter selbst durchführen – Generics sind keine Templates. Verwenden Sie stattdessen Interfaces oder das Paket reflect.

// WRONG:
func Foo[T any](v T) {
    if x, ok := v.(int); ok { // compile error
    }
}

Comparable bedeutet nicht Ordered

comparable unterstützt nur ==. Für die Verwendung von <, > benötigen Sie cmp.Ordered oder ein eigenes Constraint. Häufig wird fälschlicherweise angenommen, dass comparable auch die Ordnung abdeckt.

Methoden können keine Typparameter einführen

Methoden generischer Typen verwenden die Typparameter des Typs erneut, können aber keine neuen hinzufügen. Wenn eine Methode einen zusätzlichen Typparameter benötigt, verwenden Sie stattdessen eine Funktion auf Paketebene.

// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile error

Nil- und Nullwerte

Bei Typparametern für Zeigertypen ist der Nullwert nil. Bei Werttypen ist es der Nullwert des jeweiligen Typs. Behandeln Sie den Nullfall immer, statt davon auszugehen, dass der Wert nicht nil ist.

Methodenmengen von Interfaces und Generics

Eine generische Funktion, deren Typparameter durch ein Interface eingeschränkt ist, kann nur die in diesem Interface deklarierten Methoden aufrufen. Das Hinzufügen von Methoden zu einem konkreten Typ macht diese über das Constraint nicht verfügbar.

Aufblähung durch Instanziierung (GC shapes)

Go teilt Implementierungen für Typen mit derselben GC shape (z. B. teilen sich alle Zeigertypen eine Implementierung). Primitive Typen erhalten jeweils eine eigene Implementierung – der Ansatz von Go hält die Binärgrößen dennoch in einem angemessenen Rahmen.

Any ist nicht interface{}

any ist ein Alias für interface{}, aber eine generische Funktion F[T any] ist nicht dasselbe wie F(v interface{}) – in der generischen Funktion ist T am Aufrufort der konkrete Typ, wodurch die Typinformationen erhalten bleiben.

Rekursive generische Typen

Go unterstützt keine rekursiven Definitionen von Typparametern wie type Tree[T Tree[T]]. Verwenden Sie stattdessen Komposition:

type TreeNode[T any] struct {
    Val   T
    Left  *TreeNode[T]
    Right *TreeNode[T]
}

Vorab instanziierte Helfer

Instanziieren Sie für leistungskritischen Code häufig verwendete generische Funktionen als Funktionen auf Paketebene vorab, um den wiederholten Aufwand der Typschlussfolgerung zu vermeiden (der Go-Compiler verarbeitet dies allerdings sehr effizient).

Generischen Code testen

Testen Sie generische Funktionen mit mehreren Instanziierungen: jeweils eine für jedes unterschiedliche Constraint (int, string, ein benutzerdefinierter Typ). So werden Edge Cases erkannt, die vom Constraint abhängen.

func TestMap(t *testing.T) {
    got := Map([]int{1,2}, double)
    // test with strings too
    gotS := Map([]string{"a","b"}, strings.ToUpper)
}

Schnelltest

Warum können Sie innerhalb einer generischen Funktion keinen Type-Switch auf einem generischen Typparameter T durchführen?

Zusammenfassung: Fallstricke bei Generics

Wichtige Punkte:

  • Verwenden Sie Generics nicht übermäßig; konkrete Typen sind bei einmaliger Verwendung einfacher
  • Kein Type-Switch und keine Type Assertion auf T innerhalb generischer Funktionen
  • comparable bedeutet nicht ordered; verwenden Sie cmp.Ordered für die Unterstützung von <
  • Methoden können keine neuen Typparameter einführen

Häufig gestellte Fragen

Ist die Lektion „Generics in der Praxis: Fallstricke“ kostenlos?

Ja — der vollständige Text von „Generics in der Praxis: Fallstricke“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Generics in der Praxis: Fallstricke“?

Wann Sie Generics verwenden sollten und welche Fehler häufig auftreten Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Generics in der Praxis: Fallstricke“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Syntax von Typparametern
  2. Constraints: comparable und Interfaces
  3. Generische Datenstrukturen
  4. Generics in der Praxis: Fallstricke
← Zurück zu Go Academy