Funktionale Programmierung in Go: von A bis Z

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

Funktionale Programmierung in Go: von A bis Z



Go (Golang) ist eine Sprache, die oft mit imperativer und nebenläufiger Programmierung assoziiert wird. Ihr flexibles Typsystem und First-Class-Funktionen ermöglichen jedoch die erfolgreiche Anwendung des funktionalen Stils. In diesem Artikel werden wir untersuchen, wie man funktionale Programmierung (FP) in Go nutzt: von grundlegenden Konzepten bis zu praktischen Beispielen. Sie erfahren, wie Sie saubereren, vorhersagbareren und testbareren Code schreiben können.



Was ist funktionale Programmierung im Kontext von Go?



Funktionale Programmierung ist ein Paradigma, bei dem Berechnungen auf der Anwendung von Funktionen basieren, wobei Zustandsänderungen und Seiteneffekte vermieden werden. In Go wird dies ausgedrückt durch:

  • Reine Funktionen – das Ergebnis hängt nur von den Argumenten ab, es gibt keine Mutation externer Daten.
  • Funktionen höherer Ordnung – Funktionen, die andere Funktionen als Argumente akzeptieren oder zurückgeben.
  • Closures – anonyme Funktionen, die sich Variablen aus dem äußeren Gültigkeitsbereich „merken“.
  • Unveränderlichkeit von Daten – Bevorzugung von Kopieren statt Ändern.


Obwohl Go keine rein funktionale Sprache ist (es gibt keine Monaden oder algebraischen Datentypen), bietet es dennoch genügend Werkzeuge für die effektive Nutzung von FP-Ansätzen.



Anonyme Funktionen und Closures



In Go sind Funktionen Objekte erster Klasse. Sie können Variablen zugewiesen, an andere Funktionen übergeben und zurückgegeben werden. Anonyme Funktionen (Lambdas) sind die Grundlage des funktionalen Stils.



Beispiel einer anonymen Funktion

package main

import "fmt"

func main() { // Anonyme Funktion, einer Variable zugewiesen multiply := func(x, y int) int { return x * y }

result := multiply(5, 3) fmt.Println(result) // 15}


Closures

Ein Closure ist eine anonyme Funktion, die Variablen aus dem äußeren Gültigkeitsbereich „einfängt“. Dies ist ein mächtiges Werkzeug zum Erstellen von Generatoren und zustandsbehafteten Funktionen.



package main

import "fmt"

// Sequenzgeneratorfunc sequence() func() int { i := 0 return func() int { i++ return i }}

func main() { next := sequence() fmt.Println(next()) // 1 fmt.Println(next()) // 2 fmt.Println(next()) // 3

// Jeder Aufruf von sequence() erzeugt ein neues Closure next2 := sequence() fmt.Println(next2()) // 1}


Closures eignen sich ideal zum Kapseln von Zuständen ohne Verwendung globaler Variablen – das ist die Grundlage des funktionalen Ansatzes in Go.



Reine Funktionen und Unveränderlichkeit



Eine reine Funktion hat keine Seiteneffekte und verändert die übergebenen Daten nicht. In Go erfordert dies einen bewussten Ansatz, da Slices und Maps als Referenz übergeben werden.



Beispiel einer reinen Funktion (ohne Mutation)

package main

import "fmt"

// Reine Funktion: verändert das ursprüngliche Slice nichtfunc doubleValues(input []int) []int { result := make([]int, len(input)) for i, v := range input { result[i] = v * 2 } return result}

func main() { original := []int{1, 2, 3, 4} doubled := doubleValues(original)

fmt.Println("Original:", original) // [1 2 3 4] fmt.Println("Doubled:", doubled) // [2 4 6 8]}


Beachten Sie: Wir erstellen ein neues Slice, anstatt das ursprüngliche zu verändern. Dies gewährleistet Unveränderlichkeit (Immutability) – ein Schlüsselprinzip der FP.



Funktionen höherer Ordnung: map, filter, reduce

Obwohl Go keine eingebauten Methoden map/filter/reduce für Slices hat, lassen sie sich leicht selbst implementieren.



package main

import "fmt"

// Map – wendet eine Funktion auf jedes Element anfunc Map[T any](items []T, fn func(T) T) []T { result := make([]T, len(items)) for

Blogs

Buchempfehlungen