Funktionen in Go übergeben: Vom Anfänger zum Profi in 15 Minuten

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

Kann man eine Funktion als Parameter übergeben? Ja, und hier ist, warum das alles verändert

\n\n

Haben Sie sich jemals gefragt, ob man in Go eine Funktion in eine andere übergeben kann, wie eine normale Variable? Wenn Sie aus der Welt von Python oder JavaScript kommen, ist das für Sie ein vertrautes Pattern. Aber in Go, trotz aller Strenge, Funktionen als Parameter — das ist nicht nur "möglich", es ist eines der mächtigsten Werkzeuge der Sprache.

\n\n

Ich erinnere mich an meine erste Begegnung mit diesem Konzept: Ich schrieb ein Dienstprogramm zur Logverarbeitung und stellte fest, dass ich dieselbe Schleife mit unterschiedlicher Logik darin kopierte. Die Lösung kam, als ich erkannte, dass ich einfach die benötigte Funktion als Argument übergeben konnte. Der Code wurde sauberer, kürzer und verständlicher. In diesem Artikel zeige ich Ihnen, wie Sie die Übergabe einer Funktion an eine Funktion in Go meistern — von einfachen Beispielen bis zu echten Patterns, die Sie morgen bei der Arbeit verwenden können.

\n\n

Übrigens sehen wir auf PythonLib oft Fragen wie "Can functions be passed as parameters?" auf Stack Overflow mit Tausenden von Aufrufen. Lassen Sie uns dieses Thema ein für alle Mal am Beispiel von Go behandeln.

\n\n

Was sind Funktionen als Parameter in Go?

\n\n

In Go sind Funktionen Objekte erster Klasse. Das bedeutet, man kann sie:

\n
    \n
  • Variablen zuweisen
  • \n
  • An andere Funktionen übergeben
  • \n
  • Von Funktionen zurückgeben
  • \n
  • In Strukturen und Slices speichern
  • \n
\n\n

Wenn wir über Funktionen als Parameter sprechen, meinen wir, dass eine Funktion eine andere Funktion als Argument annimmt und sie in sich selbst aufruft. Klingt kompliziert? In Wirklichkeit ist es einfacher, als es scheint.

\n\n

Syntax: Wie deklariert man eine Funktion, die eine andere Funktion annimmt

\n\n

In Go muss man den Typ der Parameterfunktion explizit angeben. Das sieht so aus:

\n\n
// Deklarieren des Funktionstyps\ntype Transformer func(string) string\n\n// Funktion, die eine andere Funktion annimmt\nfunc processText(text string, transform Transformer) string {\n    return transform(text)\n}
\n\n

Oder man kann den Typ direkt in der Signatur deklarieren:

\n\n
func processText(text string, transform func(string) string) string {\n    return transform(text)\n}
\n\n

Beide Varianten sind funktionsfähig. Die erste ist praktischer, wenn Sie den Typ wiederverwenden möchten. Die zweite für schnelle Lösungen.

\n\n

Einfaches Beispiel: Eine Begrüßungsfunktion übergeben

\n\n

Schreiben wir etwas Lebensnahes. Stellen Sie sich vor, Sie haben eine Funktion, die den Benutzernamen formatiert, und Sie möchten verschiedene Begrüßungen einsetzen:

\n\n
package main\n\nimport "fmt"\n\n// Typ für die Begrüßungsfunktion\ntype Greeter func(name string) string\n\n// Funktion, die eine Begrüßung annimmt\nfunc greetUser(name string, greeter Greeter) {\n    message := greeter(name)\n    fmt.Println(message)\n}\n\nfunc main() {\n    // Normale Begrüßung\n    normalGreet := func(name string) string {\n        return "Hallo, " + name + "!"\n    }\n\n    // Formelle Begrüßung\n    formalGreet := func(name string) string {\n        return "Sehr geehrte(r) " + name + ", guten Tag."\n    }\n\n    greetUser("Anna", normalGreet)\n    greetUser("Anna", formalGreet)\n}
\n\n

Ausgabe:

\n
Hallo, Anna!\nSehr geehrte(r) Anna, guten Tag.
\n\n

Sehen Sie? Wir haben einfach verschiedene Funktionen an dieselbe greetUser übergeben. Das ist die Übergabe einer Funktion als Argument in Aktion.

\n\n

Callback-Funktionen: Wenn das Ergebnis verarbeitet werden muss

\n\n

Eines der häufigsten Szenarien für die Verwendung von Funktionen als Parameter sind Callbacks. Sie führen eine Operation aus und rufen die übergebene Funktion auf, wenn die Operation abgeschlossen ist.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\n// Funktion, die einen langen Datenladevorgang simuliert\nfunc fetchData(callback func(string)) {\n    fmt.Println("Daten werden geladen...")\n    time.Sleep(2 * time.Second) // Simulation einer Verzögerung\n    data := "Wichtige Daten aus der Datenbank"\n    callback(data)                

Blogs

Buchempfehlungen