Heim >Backend-Entwicklung >Golang >So verwenden Sie den Bereich zum Iterieren in Golang

So verwenden Sie den Bereich zum Iterieren in Golang

PHPz
PHPzOriginal
2023-04-18 15:22:55618Durchsuche

range ist ein Schlüsselwort in der Go-Sprache, das zum Iterieren von Arrays, Slices, Kanälen und anderen Sammlungstypen verwendet wird. Durch die Verwendung der Range-Schlüsselwortsyntax kann der Code prägnanter und klarer gestaltet werden. Wenn Sie den Bereich zum Iterieren verwenden, müssen Sie einige Details und Unterschiede in verschiedenen Szenarien beachten.

  1. Iterieren über Arrays und Slices

Beim Iterieren über Arrays und Slices gibt der Bereich zwei Werte zurück: den Index und den Elementwert. Mit dem Platzhalter _ kann einer der Werte weggelassen werden.

Beispiel:

arr := [5]int{1, 2, 3, 4, 5}
for index, value := range arr {
    fmt.Printf("index: %d, value: %d\n", index, value)
}

sli := []string{"hello", "world", "golang"}
for i, v := range sli {
    fmt.Printf("i: %d, v: %s\n", i, v)
}

Wenn Sie beim Durchlaufen eines Arrays oder Slice nur den Index- oder Elementwert benötigen, können Sie den Platzhalter _ verwenden, um die entsprechende Variable zu ignorieren. Zum Beispiel:

arr := [5]int{1, 2, 3, 4, 5}
for index, _ := range arr {
    fmt.Printf("index: %d\n", index)
}

sli := []string{"hello", "world", "golang"}
for i := range sli {
    fmt.Printf("i: %d\n", i)
}
  1. Über Karte iterieren

Beim Iterieren über Karte gibt der Bereich zwei Werte zurück: Schlüssel und Wert. Der Unterschied zu einem Array besteht darin, dass Schlüssel-Wert-Paare anstelle von Indizes und Elementwerten zurückgegeben werden.

Beispiel:

m := map[string]int{"a":1, "b":2, "c":3}
for key, value := range m {
    fmt.Printf("key: %s, value: %d\n", key, value)
}

Kann auch beim Iterieren von Map_ verwendet werden. Ignorieren Sie einen der Werte:

m := map[string]int{"a":1, "b":2, "c":3}
for k := range m {
    fmt.Println("key:", k)
}
  1. String iterieren#🎜🎜 #
Beim Durchlaufen einer Zeichenfolge gibt der Bereich zwei Werte zurück. Der erste Wert ist der Index des Zeichens und der zweite Wert ist der Zeichenwert an diesem Index. Es ist zu beachten, dass die Zeichenfolge während der Programmkompilierung in ein Byte-Array umgewandelt wird, sodass Bytes und nicht Zeichen iteriert werden.

Beispiel:

str := "hello,世界!"
for index, ch := range str {
    fmt.Printf("index: %d, char: %c\n", index, ch)
}
    Iterationskanal
Beim Iterieren des Kanals wird der Bereich weiterhin blockiert und gewartet. Es gibt Inhalte im Kanal zum Lesen. Die Bereichsschleife endet, wenn der Kanal geschlossen oder der Lesevorgang abgeschlossen ist. Die Variable in der Bereichsschleife ist die Variable, die den Kanalwert akzeptiert.

Beispiel:

ch := make(chan int, 10)
go func() {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}()

for val := range ch {
    fmt.Println("value:", val)
}
Bei der Verwendung von Kanälen muss besonders darauf geachtet werden, dass das Programm einfriert, wenn der Wert im Kanal nicht gelesen wird. Sie können dieses Problem lösen, indem Sie gepufferte Kanäle oder SELECT-Anweisungen verwenden.

Beispiel für einen Pufferkanal:

ch := make(chan int, 10)
go func() {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}()

for {
    select {
    case val, ok := <-ch:
        if !ok {
            return
        }
        fmt.Println("value:", val)
    default:
        // 通道中没有值可读
    }
}
    Wiederverwendung von Schleifenvariablen
Wenn Sie den Bereich für die Schleifeniteration verwenden, müssen Sie bezahlen Aufmerksamkeit auf das Problem der Wiederverwendung von Schleifenvariablen. Wenn Sie eine Variable innerhalb einer Schleife verwenden, muss diese in eine neue Variable kopiert werden, da sonst Probleme beim Überschreiben der Daten auftreten.

Beispiel:

// 错误示例
sli := []int{1, 2, 3}
for _, v := range sli {
    go func() {
        fmt.Println(v) // 输出结果都是 3
    }()
}

// 正确示例
sli := []int{1, 2, 3}
for _, v := range sli {
    val := v // 复制变量
    go func() {
        fmt.Println(val)
    }()
}
Kurz gesagt, Range ist ein sehr praktisches Schlüsselwort in der Go-Sprache, das uns dabei helfen kann, Elemente in einer Sammlung zu iterieren. Wenn Sie den Bereich verwenden, müssen Sie beim Iterieren verschiedener Arten von Sammlungen auf die unterschiedlichen Rückgabewerte sowie auf das Problem der Wiederverwendung von Schleifenvariablen achten.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Bereich zum Iterieren in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn