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
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
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
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
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
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
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 111Weitere Erweiterungen