在Golang中,for range是遍历数组、切片和Map最常用的写法。它通过一个循环结构自动迭代集合中的每一个元素,不需要手动维护下标。理解它的返回值和常见陷阱,能帮助你写出更可靠的Go代码。

遍历数组和切片
对于数组和切片,for range每次迭代会返回两个值:索引和该位置的元素副本。如果只需要元素,可以用下划线忽略索引。
package main
import "fmt"
func main() {
nums := []int{10, 20, 30}
// 同时获取索引和值
for i, v := range nums {
fmt.Println("index:", i, "value:", v)
}
// 只获取值,忽略索引
for _, v := range nums {
fmt.Println("value:", v)
}
}
注意元素副本问题
range返回的值是集合中元素的拷贝,而不是引用。如果在循环里修改v,不会影响原切片。
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
for _, v := range nums {
v = v * 10 // 只修改了副本
}
fmt.Println(nums) // 输出 [1 2 3]
// 正确修改方式:通过索引
for i := range nums {
nums[i] = nums[i] * 10
}
fmt.Println(nums) // 输出 [10 20 30]
}
遍历Map
遍历Map时,for range返回键和对应的值。顺序是不固定的,每次运行可能不同。
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for k, v := range m {
fmt.Println("key:", k, "value:", v)
}
// 只遍历键
for k := range m {
fmt.Println("key only:", k)
}
}
在遍历时删除和新增
在Go中,遍历Map时删除当前键是安全的,但新增的键值对不一定会被遍历到。
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
for k := range m {
if k == "a" {
delete(m, k) // 安全删除
}
}
fmt.Println(m)
}
常见用法对比
下表列出不同集合使用for range时的返回值含义:
| 集合类型 | 第一个返回值 | 第二个返回值 |
|---|---|---|
| 数组/切片 | 索引(int) | 元素值(副本) |
| Map | 键(key) | 值(value) |
小结
使用Golang的for range遍历数组、切片和Map非常简洁。记住range给的是值副本,要改原数据就通过索引或键去操作。遍历Map时别依赖顺序,也注意增删行为。这样就能在日常开发中稳定使用for range处理各类集合。