Gibt es foreach in Go? Schritt-für-Schritt-Anleitung für Anfänger

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

Gibt es foreach in Go? Schritt-für-Schritt-Tutorial mit Beispielen

\n\n

Wenn Sie von Python, JavaScript oder PHP zu Go kommen, sind Sie wahrscheinlich das prägnante foreach zum Durchlaufen von Sammlungen gewohnt. Und dann schreiben Sie Ihre erste Schleife in Go und fragen sich: „Wo ist mein geliebtes foreach? Gibt es das etwa nicht in Go?“

\n\n

Spoiler: Ein direktes Schlüsselwort foreach gibt es in Go tatsächlich nicht. Aber es gibt etwas viel Flexibleres und Mächtigeres – die for range-Konstruktion. In diesem Tutorial werden wir analysieren, wie Iteration in Go funktioniert, zeigen echte Codebeispiele und vergleichen sie mit dem bekannten foreach aus anderen Sprachen.

\n\n

Warum gibt es kein foreach in Go und wozu braucht man range?

\n\n

Go ist eine minimalistische Sprache. Seine Entwickler haben bewusst die Duplizierung syntaktischer Konstruktionen vermieden. Anstatt ein separates Schlüsselwort foreach hinzuzufügen, haben sie die Möglichkeiten der bestehenden for-Schleife erweitert. So entstand for range – ein universelles Werkzeug zum Durchlaufen von Arrays, Slices, Maps, Strings und sogar Channels.

\n\n

Wenn Sie nach einem genauen Analogon zu foreach in Go suchen, dann ist es das – for range.

\n\n

Syntax von for range: Einfach erklärt

\n\n

Die grundlegende Struktur sieht so aus:

\n\n
for index, value := range collection {\n    // Schleifenkörper\n}
\n\n

Wobei:

\n
    \n
  • index – der Index des Elements (für Arrays und Slices) oder der Schlüssel (für Maps).
  • \n
  • value – eine Kopie des Werts des Elements.
  • \n
  • collection – Ihre Sammlung (Slice, Array, Map, String oder Channel).
  • \n
\n\n

Ein wichtiger Punkt: value ist immer eine Kopie des Elements. Wenn Sie value innerhalb der Schleife ändern, ändert sich das ursprüngliche Element nicht. Um die Originale zu ändern, müssen Sie über den Index darauf zugreifen.

\n\n

Beispiel 1: Durchlaufen eines Slices – Analogon zu foreach in Go

\n\n

Beginnen wir mit dem häufigsten Fall – dem Durchlaufen von Slice-Elementen:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    fruits := []string{"Apfel", "Banane", "Kirsche", "Melone"}\n\n    fmt.Println("Slice-Durchlauf (Analogon zu foreach):")\n    for index, fruit := range fruits {\n        fmt.Printf("Index %d: %s\\n", index, fruit)\n    }\n}
\n\n

Ausgabe:

\n
Slice-Durchlauf (Analogon zu foreach):\nIndex 0: Apfel\nIndex 1: Banane\nIndex 2: Kirsche\nIndex 3: Melone
\n\n

Wenn Sie nur den Index benötigen (z. B. zum Ändern von Elementen), können Sie den Wert weglassen:

\n\n
for i := range fruits {\n    fruits[i] = "Frucht: " + fruits[i]\n}
\n\n

Und wenn Sie nur die Werte benötigen, verwenden Sie den Unterstrich _:

\n\n
for _, fruit := range fruits {\n    fmt.Println(fruit)\n}
\n\n

Beispiel 2: Durchlaufen einer Map – klassisches foreach

\n\n

In Go gibt es keine elegantere Möglichkeit, Maps zu durchlaufen, als mit for range:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    ages := map[string]int{\n        "Anna": 25,\n        "Boris": 30,\n        "Viktor": 35,\n    }\n\n    fmt.Println("Map-Durchlauf (foreach):")\n    for name, age := range ages {\n        fmt.Printf("%s: %d Jahre\\n", name, age)\n    }\n}
\n\n

Die Reihenfolge des Map-Durchlaufs in Go ist nicht garantiert. Wenn Sie eine stabile Reihenfolge benötigen, sammeln Sie die Schlüssel in einem Slice und sortieren Sie ihn.

\n\n

Beispiel 3: Durchlaufen eines Strings – zeichenweise Iteration

\n\n

Im Gegensatz zu vielen Sprachen iteriert for range in Go über Runen (Unicode-Zeichen) und nicht über Bytes:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    text := "Hallo, Go!"\n\n    fmt.Println("String-Durchlauf zeichenweise:")\n    for i, r := range text {\n        fmt.Printf("Position %d: Zeichen '%c' (Code %U)\\n", i, r, r)\n    }\n}
\n\n

Beachten Sie: Der Index i zeigt auf das Startbyte der Rune, nicht auf die Ordnungsnummer des Zeichens. Bei Strings mit Einzelbyte

Blogs

Buchempfehlungen