Go 语言 for range (键值循环)
一则小广告
最近,小哈正在带小伙伴做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4
,手把手教学,前端 + 后端全栈开发,从 0 到 1 讲解每个功能开发过程,1v1 答疑,陪伴式直到项目上线,目前第六章 《Element Plus 手搭 Admin 后台管理骨架》已快完结,截止到目前,已更新 52 节内容,共计 81557 字,演示截图:433 张,持续更新中,后续还会上新更多项目,欢迎点击加入。
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