Go 语言 for range (键值循环)
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 80w+ 字,讲解图 3365+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2700+ 小伙伴加入学习 ,欢迎点击围观
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
图示:
下面代码演示了如何遍历字符串:
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