Go-Sprache Range

In Go wird das Schlüsselwort range in for-Schleifen verwendet, um über Elemente von Arrays, Slices, Channels oder Maps zu iterieren. Für Arrays und Slices gibt es den Index des Elements und den Wert zurück, der diesem Index entspricht; für Maps gibt es Schlüssel-Wert-Paare zurück.

Das range-Format der for-Schleife kann über Slices, Maps, Arrays, Strings und mehr iterieren. Das Format ist wie folgt:

for key, value := range oldMap {
    newMap[key] = value
}

Der Schlüssel und der Wert im obigen Code können weggelassen werden.

Wenn Sie nur den Schlüssel lesen möchten, ist das Format wie folgt:

for key := range oldMap

Oder so:

for key, _ := range oldMap

Wenn Sie nur den Wert lesen möchten, ist das Format wie folgt:

for _, value := range oldMap

Beispiel

Arrays und Slices

Über ein einfaches Slice iterieren,2**%dDas Ergebnis ist die entsprechende Zweierpotenz:

Beispiel

package main

import "fmt"

// Deklariere ein Slice, das Zweierpotenzen enthält
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
   // Über das pow-Slice iterieren, i ist der Index, v ist der Wert
   for i, v := range pow {
      // Gib 2 hoch i gleich v aus
      fmt.Printf("2**%d = %d\n", i, v)
   }
}

Die Ausgabe des obigen Beispiels ist:

2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128

String

Wenn range über einen String iteriert, gibt es den Index jedes Zeichens und seinen Unicode-Codepoint (Rune) zurück.

Beispiel

package main

import "fmt"

func main() {
    for i, c := range "hello" {
        fmt.Printf("index: %d, char: %c"\n", i, c)
    }
}

Die Ausgabe des obigen Beispiels ist:

index: 0, char: h
index: 1, char: e
index: 2, char: l
index: 3, char: l
index: 4, char: o

Map

Die range-Form der for-Schleife kann Schlüssel und Wert weglassen, wie im folgenden Beispiel:

Beispiel

package main

import "fmt"

func main() {
    // Eine leere Map erstellen, Schlüssel ist vom Typ int, Wert ist vom Typ float32
    map1 := make(map[int]float32)
   
    // Schlüssel-Wert-Paare zu map1 hinzufügen
    map1[1] = 1.0
    map1[2] = 2.0
    map1[3] = 3.0
    map1[4] = 4.0
   
    // Über map1 iterieren und Schlüssel und Wert lesen
    for key, value := range map1 {
        // Schlüssel und Wert ausgeben
        fmt.Printf("Schlüssel ist: %d - Wert ist: %f\n", key, value)
    }

    // Über map1 iterieren und nur den Schlüssel lesen
    for key := range map1 {
        // Schlüssel ausgeben
        fmt.Printf("Schlüssel ist: %d\n", key)
    }

    // Über map1 iterieren und nur den Wert lesen
    for _, value := range map1 {
        // Den Wert ausgeben
        fmt.Printf("Wert ist: %f\n", value)
    }
}

Die Ausgabe des obigen Beispiels ist:

key is: 4 - value is: 4.000000
key is: 1 - value is: 1.000000
key is: 2 - value is: 2.000000
key is: 3 - value is: 3.000000
key is: 1
key is: 2
key is: 3
key is: 4
value is: 1.000000
value is: 2.000000
value is: 3.000000
value is: 4.000000

Kanal

range iteriert über Werte, die von einem Channel empfangen werden, bis der Channel geschlossen ist.

Beispiel

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    close(ch)
   
    for v := range ch {
        fmt.Println(v)
    }
}

Die Ausgabe des obigen Beispiels ist:

1
2

Den Wert ignorieren

Beim Iterieren können Sie_verwenden, um den Index oder den Wert zu ignorieren.

Beispiel

package main

import "fmt"

func main() {
    nums := []int{2, 3, 4}
   
    // Index ignorieren
    for _, num := range nums {
        fmt.Println("value:", num)
    }
   
    // Wert ignorieren
    for i := range nums {
        fmt.Println("index:", i)
    }
}

Die Ausgabe des obigen Beispiels ist:

value: 2
value: 3
value: 4
index: 0
index: 1
index: 2

Sonstiges

range iteriert über andere Datenstrukturen:

Beispiel

package main
import "fmt"
func main() {
    // Hier verwenden wir range, um ein Slice zu summieren. Die Verwendung eines Arrays ist sehr ähnlich.
    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    fmt.Println("sum:", sum)
    // Die Verwendung von range auf einem Array übergibt zwei Variablen: den Index und den Wert. Im obigen Beispiel brauchten wir den Index des Elements nicht, also ließen wir ihn mit dem Blank Identifier "_" weg. Manchmal müssen wir seinen Index jedoch kennen.
    for i, num := range nums {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }
    // range kann auch für map-Schlüssel-Wert-Paare verwendet werden.
    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }

    // range kann auch verwendet werden, um Unicode-Strings zu durchlaufen. Der erste Parameter ist der Index des Zeichens, und der zweite ist das Zeichen (der Unicode-Wert) selbst.
    for i, c := range "go" {
        fmt.Println(i, c)
    }
}

Die Ausgabe des obigen Beispiels ist:

sum: 9
index: 1
a -> apple
b -> banana
0 103
1 111
Weitere Erweiterungen