案例实战:Go语言for range遍历经典应用场景

简介: 案例实战:Go语言for range遍历经典应用场景

/ Go 语言 for range 循环攻略 /

在 Go 语言中,for range 循环是非常常用的遍历方式,可以用来遍历数组、切片、字符串、map 等数据结构。合理运用 for range 可以使代码更加简洁高效。

本文将全面介绍 Go 语言中 for range 的相关用法,内容包括:

  1. range 基本用法
  2. range 的原理
  3. 遍历数组
  4. 遍历切片
  5. 遍历字符串
  6. 遍历 map
  7. 遍历 channel
  8. for range 的性能
  9. for range 的陷阱和最佳实践

通过详细的概念讲解、源码分析和示例代码,你可以深入理解 Go 语言 for range 的设计思想和工作机制,并能够熟练使用 for range 处理各种数据类型。

1

 

1. range 基本用法

Go 语言中可以使用 range 配合 for 循环来遍历数组、切片、字符串、map 及 channel 等,格式如下:

for key, value := range coll {
  //代码
}

range 返回集合的索引和值,key 是索引,value 是对应的值。

2

 

2. range 的原理

range 在底层是以指针形式遍历的:

for ptr, end := &coll[0], &coll[len(coll)]; ptr != end; ptr++ {
  // 指针ptr遍历
}

这样 range 完成了:

  1. 获取开始和结束指针
  2. 指针自增访问每个元素
  3. 返回 key 和 value

理解这一点,有助于分析 range 的行为。

3

 

3. 遍历数组

遍历数组可以直接通过 range:

for i, v := range [3]int{1, 2, 3} {
  fmt.Println(i, v) 
}
// 0 1
// 1 2 
// 2 3

range 返回数组索引和值。

4

 

4. 遍历切片

切片遍历也类似:设置标签

for i, v := range []string{"a", "b", "c"} {
  fmt.Println(i, v)
}
// 0 a
// 1 b
// 2 c

range 可以遍历各种类型的切片。

5

 

5. 遍历字符串

字符串在 Go 里是字节切片,也可以用 range 迭代:

for i, v := range "abc" {
  fmt.Println(i, string(v)) 
}
// 0 a  
// 1 b
// 2 c

    6

     

    6. 遍历 map

    遍历 map 时,range 返回 key 和 value:

    kvs := map[string]string{"a":"apple", "b":"banana"}
    for k, v := range kvs {
      fmt.Println(k, v) 
    }
    // 随机顺序打印kv

    注意 map 的遍历顺序是不确定的。

    7

     

    7. 遍历 channel

    可以对一个 channel 使用 range 不断获取发送的值:

    ch := make(chan int)
    // 发送者
    go func() {
      ch <- 1
      ch <- 2
      close(ch)
    }()
    // 接收者
    for v := range ch {
      fmt.Println(v)
    }

    需要关闭 channel 来结束 range。

    8

     

    8. range 性能

    range 每次遍历会生成迭代值的副本,如果元素较大会带来额外性能损耗:

    for _, s := range slice {
      process(s) // 传入副本
    }

    可以传入索引遍历,避免值拷贝:

    for i := range slice {
      process(slice[i]) // 传入原值
    }

    9

     

    9. 陷阱和最佳实践

    for range 使用时有一些需要注意的地方:

    • 修改 slice 值时可能引发 Bug
    • 遍历 map 时删除元素需注意
    • channel 需要关闭
    • 复用变量需小心

    建议使用索引变量访问元素可以避免部分问题。

    另外 range 代码块最好使用局部变量,而不是外部变量。

    10

     

    总结

    通过本文可以全面了解 Go 语言中 for range 的用法细节。range 可以帮助我们非常方便地遍历各种数据结构,是 Go 语言编程中非常重要的一个设计。合理运用 range 可以使代码更简洁高效。


    目录
    相关文章
    |
    4天前
    |
    监控 编译器 Go
    1 行命令引发的Go应用崩溃
    这篇文章分析了Go编译时插桩工具导致go build -race竞态检测产生崩溃的原因。
    |
    2天前
    |
    存储 监控 算法
    内网监控系统之 Go 语言布隆过滤器算法深度剖析
    在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
    18 5
    |
    11天前
    |
    算法 安全 Go
    Go语言中的加密和解密是如何实现的?
    Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
    35 14
    |
    11天前
    |
    存储 安全 Go
    Go语言中的map数据结构是如何实现的?
    Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
    |
    Go 索引
    Go基础:range、循环控制Goto、Break、Continue
    Go基础:range、循环控制Goto、Break、Continue
    2442 0
    |
    1月前
    |
    存储 监控 算法
    员工上网行为监控中的Go语言算法:布隆过滤器的应用
    在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
    82 8
    员工上网行为监控中的Go语言算法:布隆过滤器的应用
    |
    1月前
    |
    存储 Go 索引
    go语言中数组和切片
    go语言中数组和切片
    46 7
    |
    1月前
    |
    Go 开发工具
    百炼-千问模型通过openai接口构建assistant 等 go语言
    由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
    |
    1月前
    |
    程序员 Go
    go语言中结构体(Struct)
    go语言中结构体(Struct)
    113 71
    |
    1月前
    |
    存储 Go 索引
    go语言中的数组(Array)
    go语言中的数组(Array)
    116 67