781 Stimmen

Gibt es in Go eine foreach-Schleife?

Gibt es eine foreach Konstrukt in der Sprache Go? Kann ich über ein Slice oder Array iterieren, indem ich eine for ?

1124voto

Keith Thompson Punkte 240701

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.

228voto

Zippo Punkte 14520

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
    }
}

24voto

Nisal Edu Punkte 6179

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

16voto

Amitesh Bharti Punkte 10156

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.

13voto

ceving Punkte 19595

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X