Fortgeschrittenes funktionales Programmieren in Go

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

Funktionales Programmieren in Go: Fortgeschrittenes Niveau

\n\n

Go (Golang) ist keine rein funktionale Sprache, aber sein starkes Typsystem, die Unterstützung von Closures und Funktionen erster Klasse ermöglichen die effektive Anwendung funktionaler Paradigmen. Auf fortgeschrittenem Niveau hilft funktionales Programmieren in Go dabei, vorhersagbareren, testbareren und nebenläufigkeitssicheren Code zu schreiben. In diesem Artikel betrachten wir die Schlüsselkonzepte: reine Funktionen, Komposition, Closures, Currying, monadische Muster und die Arbeit mit Fehlern ohne Ausnahmen.

\n\n

1. Reine Funktionen und Unveränderlichkeit

\n\n

Eine reine Funktion ist eine Funktion, die:

\n
    \n
  • Für dieselben Argumente immer dasselbe Ergebnis zurückgibt (Determinismus).
  • \n
  • Keine Nebenwirkungen hat (keinen externen Zustand ändert, nicht in Dateien/Netzwerk schreibt).
  • \n
\n\n

In Go wird Unveränderlichkeit durch die Übergabe von Kopien der Daten und die Verwendung von Konstanten erreicht. Beispiel einer reinen Funktion:

\n\n
package main\n\nimport "fmt"\n\n// Reine Funktion: ändert das ursprüngliche Slice nicht, gibt ein neues zurück\nfunc DoubleSlice(s []int) []int {\n    result := make([]int, len(s))\n    for i, v := range s {\n        result[i] = v * 2\n    }\n    return result\n}\n\nfunc main() {\n    original := []int{1, 2, 3}\n    doubled := DoubleSlice(original)\n    fmt.Println(original) // [1 2 3] — unverändert\n    fmt.Println(doubled)  // [2 4 6]\n}
\n\n

Die Verwendung reiner Funktionen vereinfacht Refactoring und Testen, da kein versteckter Zustand berücksichtigt werden muss.

\n\n

2. Funktionen höherer Ordnung und Closures

\n\n

In Go sind Funktionen Objekte erster Klasse: Sie können als Argumente übergeben, von anderen Funktionen zurückgegeben und in Variablen gespeichert werden. Ein Closure ist eine Funktion, die Variablen aus dem äußeren Gültigkeitsbereich einfängt.

\n\n

Beispiel einer Funktion höherer Ordnung — Filter:

\n\n
package main\n\nimport "fmt"\n\n// Filter gibt ein neues Slice zurück, das die Elemente enthält, die das Prädikat erfüllen\nfunc Filter[T any](s []T, predicate func(T) bool) []T {\n    var result []T\n    for _, v := range s {\n        if predicate(v) {\n            result = append(result, v)\n        }\n    }\n    return result\n}\n\nfunc main() {\n    numbers := []int{1, 2, 3, 4, 5, 6}\n    even := Filter(numbers, func(n int) bool { return n%2 == 0 })\n    fmt.Println(even) // [2 4 6]\n}
\n\n

Closures werden häufig verwendet, um Funktionsfabriken zu erstellen oder um Zustände zu kapseln:

\n\n
package main\n\nimport "fmt"\n\n// Counter erstellt ein Closure, das einen internen Zustand speichert\nfunc Counter() func() int {\n    count := 0\n    return func() int {\n        count++\n        return count\n    }\n}\n\nfunc main() {\n    c1 := Counter()\n    fmt.Println(c1()) // 1\n    fmt.Println(c1()) // 2\n\n    c2 := Counter()\n    fmt.Println(c2()) // 1 — unabhängiger Zustand\n}
\n\n

3. Funktionskomposition und partielle Anwendung (Currying)

\n\n

Komposition ist die Kombination mehrerer Funktionen zu einer neuen. In Go wird Komposition durch Zwischenfunktionen realisiert. Partielle Anwendung (Currying) ermöglicht es, einen Teil der Argumente zu fixieren und eine Funktion zurückzugeben, die auf die verbleibenden wartet.

\n\n

Beispiel für Komposition:

\n\n
package main\n\nimport "fmt"\n\n// Compose kombiniert zwei Funktionen: f(g(x))\nfunc Compose[A, B, C any](f func(B) C, g func(A) B) func(A) C {\n    return func(x A) C {\n        return f(g(x))\n    }\n}\n\nfunc addOne(x int) int { return x + 1 }\nfunc double(x int) int { return x * 2 }\n\nfunc main() {\n    addThenDouble := Compose(double, addOne)\n    fmt.Println(addThenDouble(3)) // (3+1)*2 = 8\n}
\n\n

Currying am Beispiel einer Summenfunktion:

\n\n
package main\n\nimport "fmt"\n\n// Add — gecurryte Version der Addition\nfunc Add(a int) func(int) int {\n    return func(b int) int {\n        return a + b\n    }\n}\n\nfunc main() {\n    addFive := Add(5)\n    fmt.                

Blogs

Buchempfehlungen