Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go range

Go语言中范围range的使用小结

作者:moxiaoran5753

range是Go里用于遍历数据结构的语法糖,本文主要介绍了Go语言的范围range的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、什么是range

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

for k, v := range collection {
    ...
}

它能遍历的对象包括:

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

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

arr := []int{10, 20, 30}

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

输出:

0 10
1 20
2 30

只要值,不要索引

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

只要索引

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

三、遍历字符串

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=!

注意:

对比 Java

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

遍历中文,Go 用 range 是“正解”

四、遍历 map

m := map[string]int{
    "a": 1,
    "b": 2,
}

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

重要特性

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

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

在并发中很有用

ch := make(chan int)

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

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

特点:

六、range 的“值拷贝陷阱”

问题代码

arr := []int{1, 2, 3}

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

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

为什么没改?

正确写法

for i := range arr {
    arr[i] *= 10
}

七、什么时候不用 range?

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

八、总结

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

1. 值是拷贝;

2. map 无序;

3. 字符串按 rune。

到此这篇关于Go语言中范围range的使用小结的文章就介绍到这了,更多相关Go range内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文