Go语言的范围range

一、什么是 range

range 是 Go 里 用于遍历数据结构的语法糖,常见用法:

Go 复制代码
for k, v := range collection {
    ...
}

它能遍历的对象包括:

  • 数组 / 切片

  • 字符串

  • map

  • channel

本质上:每次循环,range 会返回"索引/键 + 值"

二、遍历数组 / 切片(最常用)

Go 复制代码
arr := []int{10, 20, 30}

for i, v := range arr {
    fmt.Println(i, v)
}

输出:

0 10

1 20

2 30

只要值,不要索引

Go 复制代码
for _, v := range arr {
    fmt.Println(v)
}

只要索引

Go 复制代码
for i := range arr {
    fmt.Println(i)
}

三、遍历字符串

Go 复制代码
s := "你好,go!"
for i, c := range s {
	fmt.Printf("index=%d,char=%c\n", i, c)
}

输出:

index=0,char=你

index=3,char=好

index=6,char=,

index=9,char=g

index=10,char=o

index=11,char=!

注意:

  • i字节索引(不是字符索引)

  • crune(Unicode 字符)

对比 Java

Java Go
char 是 UTF-16 rune 是 UTF-32
String.length() 不等于字符数 len(s) 是字节数
遍历字符较绕 range 天然支持 Unicode

遍历中文,Go 用 range 是"正解"

四、遍历 map

Go 复制代码
m := map[string]int{
    "a": 1,
    "b": 2,
}

for k, v := range m {
    fmt.Println(k, v)
}

重要特性

  • map 遍历 无序

  • 每次运行顺序可能不一样

  • Go 刻意这么设计(防止依赖顺序的 bug)

如果需要有序,需这样处理:

Go 复制代码
keys := make([]string, 0, len(m))
for k := range m {
    keys = append(keys, k)
}
sort.Strings(keys)

for _, k := range keys {
    fmt.Println(k, m[k])
}

五、遍历 channel

在并发中很有用

Go 复制代码
ch := make(chan int)

go func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v)
}

特点:

  • 一直阻塞

  • 直到 channelclose

  • 非常适合消费协程产生的数据

六、range 的"值拷贝陷阱"

问题代码

Go 复制代码
arr := []int{1, 2, 3}

for _, v := range arr {
    v = v * 10
}

fmt.Println(arr) // [1 2 3]

为什么没改?

  • v元素的拷贝

  • 修改 v 不影响原数组

正确写法

Go 复制代码
for i := range arr {
    arr[i] *= 10
}

七、什么时候不用 range?

场景 建议
需要修改原数组 用索引 for
需要精确控制步长 用经典 for
性能极限场景 手写 for 更可控
遍历 map 顺序敏感 不适合

八、总结

Go 的 range = 更安全、更简洁的 for-each,但要记住:

1. 值是拷贝;

2. map 无序;

3. 字符串按 rune。

相关推荐
有代理ip1 天前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
天远云服1 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
女王大人万岁1 天前
Go标准库 sync 详解
服务器·开发语言·后端·golang
小高Baby@1 天前
session、cookie、Jwt-token
开发语言·后端·golang
Grassto1 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
小二·1 天前
Go 语言系统编程与云原生开发实战(第12篇)云原生部署实战:Helm Chart × GitOps × 多环境管理(生产级落地)
开发语言·云原生·golang
天空属于哈夫克31 天前
Go 语言实战:构建一个企微外部群“技术贴收藏夹”小程序后端
小程序·golang·企业微信
小二·1 天前
Go 语言系统编程与云原生开发实战(第13篇)工程效能实战:Monorepo × 依赖治理 × 构建加速(10万行代码实测)
开发语言·云原生·golang
暴躁小师兄数据学院1 天前
【WEB3.0零基础转行笔记】Golang编程篇-第4讲:Go语言中的流程控制
开发语言·后端·golang·web3·区块链
lingggggaaaa2 天前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法