ZetCode

Go Range

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Golang 中迭代数据结构。

Go 的 for range 形式可用于迭代字符串、数组、切片、映射和通道。

Go Range 数组

以下示例使用 range 迭代 Go 数组。

array_range.go
package main

import "fmt"

func main() {
    
    vals := [...]int{5, 4, 3, 2, 1}

    for idx, e := range vals {

        fmt.Println("element", e, "at index", idx)
    }
}

我们迭代一个整数值数组。

$ go run array_range.go 
element 5 at index 0
element 4 at index 1
element 3 at index 2
element 2 at index 3
element 1 at index 4
array_range2.go
package main

import "fmt"

func main() {
    
    vals := [...]int{5, 4, 3, 2, 1}

    for _, e := range vals {

        fmt.Printf("%d ", e)
    }

    fmt.Println("\n******************")

    for idx, _ := range vals {

        fmt.Printf("%d ", idx)
    }

    fmt.Println("\n******************")

    for idx := range vals {

        fmt.Printf("%d -> %d\n", idx, vals[idx])
    }
}

此示例表明,可以通过使用 `_` 来跳过迭代中的索引或元素。

for idx := range vals {

    fmt.Printf("%d -> %d\n", idx, vals[idx])
}

在这种形式下,我们正在迭代索引。

Go Range 映射

以下示例使用 range 迭代 Go 映射。

map_range.go
package main

import "fmt"

func main() {
    
    data := map[string]string{

        "de": "Germany", 
        "it": "Italy",
        "sk": "Slovakia",
    } 

    for k, v := range data {

        fmt.Println(k, "=>", v)
    }

    fmt.Println("----------------------")

    for k := range data {

        fmt.Println(k, "=>", data[k])
    }
}

该示例迭代国家映射的范围,其中键和值都是字符串。

$ go run map_range.go 
de => Germany
it => Italy
sk => Slovakia
----------------------
de => Germany
it => Italy
sk => Slovakia

Go Range 字符串

以下示例使用 range 迭代 Go 字符串。

string_range.go
package main

import "fmt"

func main() {
    
    s := "合気道"

    for idx, e := range s {

        fmt.Printf("%d %c\n", idx, e)
    }

    fmt.Println()
}

在代码示例中,我们迭代 Go 字符(rune)。

$ go run string_range.go 
0 合
3 気
6 道

这是输出。每个字符(rune)有三个字节。

Go Range 通道

以下示例使用 range 迭代 Go 通道。通道是 goroutine 之间通信的管道;通信是无锁的。

channel_range.go
package main

import "fmt"

func main() {
    
    ch := make(chan int)

    go func() {

        ch <- 5
        ch <- 6
        ch <- 7
        
        close(ch)
    }()

    for n := range ch {

        fmt.Println(n)
    }
}

在代码示例中,我们迭代通过通道发送的值。

$ go run channel_range.go 
5
6
7

来源

The Go Programming Language Specification

在本文中,我们介绍了 Golang 中的 for range 形式。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Go 教程