Gibt es eine foreach
Konstrukt in der Sprache Go? Kann ich über ein Slice oder Array iterieren, indem ich eine for
?
Antworten
Zu viele Anzeigen?Von _Für Anweisungen mit Bereichsklausel_ :
Eine "for"-Anweisung mit einer "range"-Klausel iteriert durch alle Einträge eines Arrays, Slice, Strings oder einer Map oder über einen Kanal empfangene Werte. Für jeden Eintrag werden die Iterationswerte den entsprechenden Iterationsvariablen Variablen zu und führt dann den Block aus.
Ein 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 um den Index kümmern, können Sie _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
Der Unterstrich, _
ist die leere Kennung ein anonymer Platzhalter.
Go hat eine foreach
-ähnliche Syntax. Sie unterstützt Arrays/Slices, Maps und Kanäle.
Iterieren über eine Array oder eine slice :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Iterieren Sie über eine Karte :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Iterieren über eine Kanal :
for v := range theChan {}
Das Iterieren über einen Kanal ist gleichbedeutend mit dem Empfangen von einem Kanal, bis dieser geschlossen ist:
for {
v, ok := <-theChan
if !ok {
break
}
}
Es folgt ein Beispielcode für die Verwendung von foreach in Go:
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, Bereich :
Die Bereichsform des für Schleife iteriert über ein Slice oder eine Map.
Beim Durchlaufen eines 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)
}
}
- Sie können den Index oder den Wert durch Zuweisung an
_
. - Wenn Sie nur den Index benötigen, lassen Sie die
,
Wert vollständig.
Das folgende Beispiel zeigt, wie man die range
Operator in einer for
Schleife zur Implementierung einer foreach
Schleife.
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 iteriert über ein Array von Funktionen, um die Fehlerbehandlung für die Funktionen zu vereinheitlichen. Ein vollständiges Beispiel finden Sie auf Googles 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 der action()
anrufen. Ist doch klar, oder?
- See previous answers
- Weitere Antworten anzeigen