Wie man `range` als `foreach` in Go verwendet
Grace Collins
Solutions Engineer · Leapcell

Key Takeaways
- Go verwendet das Schlüsselwort
range
, um über Arrays, Slices, Maps, Strings und Kanäle zu iterieren. - Obwohl Go kein traditionelles
foreach
besitzt, erfülltrange
den gleichen Zweck auf idiomatische Weise. - Benutzerdefinierte
foreach
-Funktionen können mithilfe von Reflection für dynamischere Szenarien erstellt werden.
In Go gibt es keine eingebaute foreach
-Schleife wie in einigen anderen Sprachen. Go bietet jedoch eine leistungsstarke for
-Schleife mit dem Schlüsselwort range
, die einen ähnlichen Zweck erfüllt und die Iteration über verschiedene Datenstrukturen wie Slices, Arrays, Maps, Strings und Kanäle ermöglicht.
Iterieren über Slices und Arrays
Bei Verwendung von range
mit Slices oder Arrays werden sowohl der Index als auch der Wert jedes Elements zurückgegeben.
package main import "fmt" func main() { numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Printf("Index: %d, Value: %d\n", index, value) } }
Wenn der Index nicht benötigt wird, kann er mithilfe des Blank Identifier _
weggelassen werden:
for _, value := range numbers { fmt.Println(value) }
Iterieren über Maps
Die Verwendung von range
mit Maps ermöglicht die Iteration über Schlüssel-Wert-Paare.
fruits := map[string]string{ "a": "apple", "b": "banana", } for key, value := range fruits { fmt.Printf("%s -> %s\n", key, value) }
Beachten Sie, dass die Iterationsreihenfolge über Maps nicht garantiert ist und zwischen den Iterationen variieren kann.
Iterieren über Strings
Beim Iterieren über Strings gibt range
den Index und die Rune (Unicode-Codepunkt) an dieser Position zurück.
for index, char := range "GoLang" { fmt.Printf("Character at byte position %d: %c\n", index, char) }
Dieser Ansatz behandelt Multibyte-Zeichen in UTF-8-kodierten Strings korrekt.
Iterieren über Kanäle
range
kann auch verwendet werden, um Werte von einem Kanal zu empfangen, bis dieser geschlossen wird.
ch := make(chan int) go func() { for i := 0; i < 5; i++ { ch <- i } close(ch) }() for val := range ch { fmt.Println(val) }
Dieses Muster ist nützlich, um von Kanälen zu lesen, ohne explizit prüfen zu müssen, ob der Kanal geschlossen ist.
Benutzerdefinierte foreach
-Implementierungen
Obwohl Go's range
die meisten Iterationsanforderungen abdeckt, haben Entwickler benutzerdefinierte foreach
-Funktionen mithilfe von Reflection erstellt, um eine Funktion auf jedes Element eines Slice anzuwenden:
func ForEach(slice interface{}, fn func(interface{})) { v := reflect.ValueOf(slice) for i := 0; i < v.Len(); i++ { fn(v.Index(i).Interface()) } }
Dieser Ansatz ermöglicht das Anwenden einer Funktion auf jedes Element eines Slice, unabhängig von seinem Typ.
Fazit
Obwohl Go keine traditionelle foreach
-Schleife hat, bietet die for
-Schleife mit dem Schlüsselwort range
eine vielseitige und effiziente Möglichkeit, über verschiedene Datenstrukturen zu iterieren. Das Verständnis und die effektive Nutzung von range
ermöglicht sauberen und idiomatischen Go-Code.
FAQs
Nein, Go hat kein foreach
-Schlüsselwort. Stattdessen wird for
mit range
verwendet, um eine ähnliche Funktionalität zu erreichen.
Ja, range
funktioniert mit Maps (um Schlüssel-Wert-Paare zu erhalten) und mit Kanälen (um Werte bis zum Schließen zu empfangen).
Nein, die Iterationsreihenfolge über Maps ist zufällig und nicht konsistent zwischen den Ausführungen.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Next-Gen Serverless Plattform für Web Hosting, Async Tasks und Redis:
Multi-Language Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne ungenutzte Gebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeit-Metriken und -Protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein operativer Overhead – konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ