Go 语言 for range (键值循环)

更新时间 2022-03-31 15:00:48

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

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遍历切片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