Gehälter von PHP-Entwicklern in Russland: Marktüberblick 2025

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Generics in Go ein Durchbruch sind



Lange Zeit blieb die Go-Sprache (Golang) eine der wenigen modernen Sprachen ohne Unterstützung für generische Programmierung (Generics). Entwickler waren gezwungen, interface{} und Typumwandlungen zu verwenden, was zu einem Verlust der Typsicherheit zur Kompilierzeit führte und den Code unübersichtlich machte. Mit der Veröffentlichung von Go Version 1.18 (Februar 2022) änderte sich die Situation dramatisch.



Generics sind ein Mechanismus, der es Ihnen ermöglicht, Funktionen und Datenstrukturen zu schreiben, die mit beliebigen Typen arbeiten können, während die strenge Typisierung erhalten bleibt. In diesem Artikel werden wir analysieren, warum sie benötigt werden und anhand praktischer Beispiele zeigen, wie man sie in der täglichen Go-Entwicklung einsetzt.



Warum werden Generics in Go benötigt?



Vor dem Aufkommen von Generics verwendeten Entwickler interface{} (leeres Interface), um universelle Funktionen zu erstellen. Betrachten wir ein klassisches Beispiel – eine Funktion, die das minimale Element in einem Slice findet:



// Ohne Generics (Go < 1.18)func MinInt(a, b int) int {    if a < b {        return a    }    return b}

func MinFloat(a, b float64) float64 { if a < b { return a } return b}


Für jeden Typ musste eine separate Funktion geschrieben werden. Mit interface{} war dies möglich:



func MinInterface(a, b interface{}) interface{} {    // Erfordert Typumwandlung und Laufzeitprüfungen    // Dies ist unsicher und ineffizient}


Die Probleme dieses Ansatzes sind offensichtlich:

  • Verlust der Typsicherheit – ein Fehler kann erst zur Laufzeit auftreten.
  • Notwendigkeit der Typumwandlung – der Code wird umständlich.
  • Reduzierte Leistung – die Arbeit mit Interfaces erfordert zusätzliche Operationen.


Generics lösen all diese Probleme. Sie ermöglichen es Ihnen:

  • Universelle Algorithmen einmal zu schreiben.
  • Strenge Typprüfung zur Kompilierzeit beizubehalten.
  • Typumwandlungen zu eliminieren und die Leistung zu verbessern.


Grundlagen der Generics-Syntax in Go



Generics in Go basieren auf Typparametern. Die Syntax ist einfach und intuitiv. Typparameter werden in eckigen Klammern nach dem Funktions- oder Typnamen angegeben.



1. Eine einfache Funktion mit Generics



Schreiben wir dieselbe Minimum-Funktion, aber jetzt mit Generics:



package main

import "fmt"

// Min gibt den kleineren Wert von zwei zurückfunc Min[T comparable](a, b T) T { if a < b { return a } return b}

func main() { fmt.Println(Min[int](10, 20)) // 10 fmt.Println(Min[float64](3.14, 2.71)) // 2.71 fmt.Println(Min[string]("abc", "xyz")) // abc}


Hier ist [T comparable] der Typparameter. comparable ist eine eingebaute Einschränkung, die garantiert, dass der Typ die Vergleichsoperatoren == und != unterstützt. Hinweis: Für den <-Operator müssen Sie die Einschränkung constraints.Ordered (aus dem Paket golang.org/x/exp/constraints) oder eine eigene verwenden.



2. Einschränkungen



Einschränkungen sind Schnittstellen, die definieren, welche Methoden und Operationen Typen unterstützen müssen. In Go 1.18+ erschien das Paket constraints (derzeit in golang.org/x/exp), aber Sie können Ihre eigenen Einschränkungen erstellen.



import "golang.org/x/exp/constraints"

// MinOrdered funktioniert nur mit geordneten Typenfunc MinOrdered[T constraints.Ordered](a, b T) T { if a < b { return a } return b}


Eine benutzerdefinierte Einschränkung für Typen, die die Methode String() unterstützen:



type Stringer interface {    String() string}

// PrintString gibt einen Wert aus, der Stringer implementiertfunc PrintString[T Stringer](s T) { fmt.Println(s.String())}


Dies ermöglicht die typsichere Arbeit mit beliebigen Strukturen, die die erforderliche Methode implementieren.

Blogs

Buchempfehlungen