Gibt es ein foreach
Konstrukt in der Go-Sprache? Kann ich mit a über ein Slice oder Array iterieren for
?
range
In- for
Schleifen wird auch im Abschnitt "Ein Zwischenspiel über Typen" (gegen Ende) des Go-Tutorials erwähnt.
Gibt es ein foreach
Konstrukt in der Go-Sprache? Kann ich mit a über ein Slice oder Array iterieren for
?
range
In- for
Schleifen wird auch im Abschnitt "Ein Zwischenspiel über Typen" (gegen Ende) des Go-Tutorials erwähnt.
Antworten:
https://golang.org/ref/spec#For_range
Eine "for" -Anweisung mit einer "range" -Klausel durchläuft alle Einträge eines Arrays, Slice, Strings oder Map oder Werte, die auf einem Kanal empfangen wurden. Für jeden Eintrag werden entsprechende Iterationsvariablen Iterationswerte zugewiesen und anschließend der Block ausgeführt.
Als Beispiel:
for index, element := range someSlice {
// index is the index where we are
// element is the element from someSlice for where we are
}
Wenn Sie sich nicht für den Index interessieren, können Sie Folgendes verwenden _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
Der Unterstrich _
ist die leere Kennung , ein anonymer Platzhalter.
element
ist dies der Wert des Elements (eine Kopie) - es ist nicht das Element selbst. Obwohl Sie zuweisen können, element
hat dies keine Auswirkungen auf die zugrunde liegende Sequenz.
_()
im lokalen Namespace aliasiert ist ", was nur konventionell ist und nicht Teil der Lokalisierungsbibliothek ist. Der Unterstrich _
ist eine gültige Bezeichnung, und es ist auch eine Konvention in Go (und Python und Scala und anderen langs), die _
für Rückgabewerte zugewiesen wird, die Sie nicht verwenden. Der Umfang von _
in diesem Beispiel ist auf den Hauptteil der for
Schleife beschränkt. Wenn Sie eine Funktion mit Paketbereich haben, _
wird diese im Bereich der for-Schleife schattiert. Es gibt ein paar Pakete für die Lokalisierung, ich habe keine Verwendung _
als Funktionsname gesehen.
Go hat eine foreach
ähnliche Syntax. Es unterstützt Arrays / Slices, Maps und Kanäle.
Iterieren Sie über Array oder Slice :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Über eine Karte iterieren :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Über einen Kanal iterieren :
for v := range theChan {}
Das Iterieren über einen Kanal entspricht dem Empfangen von einem Kanal, bis dieser geschlossen wird:
for {
v, ok := <-theChan
if !ok {
break
}
}
chan
Verwendung: Wenn Sie sich über einen Kanal erstrecken, wird die Schleife ordnungsgemäß verlassen, wenn der Schreiber den Kanal irgendwann schließt. In der for {v := <-theChan}
äquivalenten , wird es nicht auf Kanal Schließen beenden. Sie können dies über den zweiten ok
Rückgabewert testen . TOUR
for { ... }
steht für eine Endlosschleife.
Das folgende Beispiel zeigt, wie der range
Operator in einer for
Schleife zum Implementieren einer foreach
Schleife verwendet wird.
func PrintXml (out io.Writer, value interface{}) error {
var data []byte
var err error
for _, action := range []func() {
func () { data, err = xml.MarshalIndent(value, "", " ") },
func () { _, err = out.Write([]byte(xml.Header)) },
func () { _, err = out.Write(data) },
func () { _, err = out.Write([]byte("\n")) }} {
action();
if err != nil {
return err
}
}
return nil;
}
Das Beispiel durchläuft ein Array von Funktionen, um die Fehlerbehandlung für die Funktionen zu vereinheitlichen. Ein vollständiges Beispiel finden Sie auf dem Google- Spielplatz .
PS: Es zeigt auch, dass hängende Klammern eine schlechte Idee für die Lesbarkeit von Code sind. Hinweis: Die for
Bedingung endet kurz vor dem action()
Anruf. Offensichtlich, nicht wahr?
,
und es ist klarer, wo die for
Bedingung endet: play.golang.org/p/pcRg6WdxBd - Dies ist tatsächlich das erste Mal, dass ich ein Gegenargument zum go fmt
Stil gefunden habe, danke!
Sie können tatsächlich verwenden, range
ohne auf die Rückgabewerte zu verweisen, indem Sie Folgendes for range
gegen Ihren Typ verwenden:
arr := make([]uint8, 5)
i,j := 0,0
for range arr {
fmt.Println("Array Loop",i)
i++
}
for range "bytes" {
fmt.Println("String Loop",j)
j++
}
Im Folgenden finden Sie den Beispielcode für die Verwendung von foreach in Golang
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index,element := range arrayOne{
fmt.Println(index)
fmt.Println(element)
}
}
Dies ist ein laufendes Beispiel https://play.golang.org/p/LXptmH4X_0
Ja, Reichweite :
Die Bereichsform der for-Schleife iteriert über ein Slice oder eine Map.
Bei einem Bereich über ein Slice werden für jede Iteration zwei Werte zurückgegeben. Der erste ist der Index und der zweite ist eine Kopie des Elements an diesem Index.
Beispiel:
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}
Dies mag offensichtlich sein, aber Sie können das Array wie folgt einbinden:
package main
import (
"fmt"
)
func main() {
for _, element := range [3]string{"a", "b", "c"} {
fmt.Print(element)
}
}
Ausgänge:
abc