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 形式。