Go 语言 for range (键值循环)

发布于: 2020-11-25 19:01:54 作者: 犬小哈 最后修订时间: 2020-11-25 19:01:54

Go 语言中,我们还可以通过 for range 来遍历数组切片字符串map 以及通道(channel)。

一、for range 遍历数组、切片、字符串

通过 for range 遍历数组、切片、字符串的返回值都有一个规律:

  • 下标索引 index
  • 下标对应的值 value

下面代码演示了如何遍历切片,数组格式类似:

package main

import "fmt"

func main()  {
	// 初始化一个切片
	slice := []int{1, 2, 3, 4}
	
	// 通过 for range 循环切片
	for index, value := range slice {
		fmt.Printf("index: %d, value: %d\n", index, value)
	}
}

代码输出如下:

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

图示:

go语言for range遍历切片

下面代码演示了如何遍历字符串:

package main

import "fmt"

func main()  {
	str := "quanxiaoha.com"

	// 通过 for range 循环字符串
	for index, value := range str {
		fmt.Printf("index: %d, value: 0x%x\n", index, value)
	}
}

代码输出如下:

index: 0, value: 0x71
index: 1, value: 0x75
index: 2, value: 0x61
index: 3, value: 0x6e
index: 4, value: 0x78
index: 5, value: 0x69
index: 6, value: 0x61
index: 7, value: 0x6f
index: 8, value: 0x68
index: 9, value: 0x61
index: 10, value: 0x2e
index: 11, value: 0x63
index: 12, value: 0x6f
index: 13, value: 0x6d

上面代码中的 value 变量实际类型是 runne, 本质上是 int32, 以十六进制格式打印出来的是字符串编码。

二、for range 遍历 map 字典

通过 for range 遍历 map 字典会返回,称为键值对,它们总是一对一出现,演示代码如下:

package main

import "fmt"

func main()  {
	m := map[int]string{
		1: "犬小哈教程",
		2: "quanxiaoha.com",
	}

	for key, value := range m {
		fmt.Printf("key: %d, value: %s\n", key, value)
	}
}

代码输出如下:

key: 1, value: 犬小哈教程
key: 2, value: quanxiaoha.com

注意: 对 map 字典进行遍历时,遍历出的键值对是无序的,如果需要有序输出,需要先排序。

三、for range 遍历通道(channel)

for range 遍历通道(channel)有点不同,此时只会输出一个值,即管道内的类型对应的数据

下面代码演示了如何遍历通道(channel):

package main

import "fmt"

func main()  {

	// 初始化一个通道
	c := make(chan int)

	// 启动一个 goroutine, 功能是往通道中推送数据 1、2、3,然后关闭通道
	go func() {
		c <- 1
		c <- 2
		c <- 3
		close(c)
	}()

	for value := range c {
		fmt.Println(value)
	}
}

注意: goroutine 在启动结束后,会被立刻并行执行。关于 goroutine,后面小节会详细介绍,这里只做了解。

上面代码输出如下:

1
2
3

四、在 for range 中使用匿名变量

假设说在 for range 遍历中只想获取下标索引,或者是值要怎么做呢?比较优雅的写法是通过匿名变量

什么是匿名变量?

  • 1、它可以理解成一种占位符;
  • 2、这种变量不会分配内存,也不会占用变量名;
  • 3、在 for range 中,可以通过匿名变量接受键 key,也可以接受值 value。

下面代码演示了如果通过匿名变量来接受 key, 循环体中只打印了值 value。

package main

import "fmt"

func main()  {
	m := map[int]string{
		1: "犬小哈教程",
		2: "quanxiaoha.com",
	}

	for _, value := range m {
		fmt.Printf("value: %s\n", value)
	}
}

代码输出如下:

value: 犬小哈教程
value: quanxiaoha.com