案例实战: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 可以使代码更简洁高效。


    目录
    相关文章
    |
    算法 Java Go
    【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
    gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
    831 4
    |
    消息中间件 缓存 NoSQL
    Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
    这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
    626 86
    |
    存储 安全 Java
    【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
    结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
    550 2
    |
    Cloud Native Go API
    Go:为云原生而生的高效语言
    Go:为云原生而生的高效语言
    734 0
    |
    Cloud Native Java Go
    Go:为云原生而生的高效语言
    Go:为云原生而生的高效语言
    568 0
    |
    Cloud Native Java 中间件
    Go:为云原生而生的高效语言
    Go:为云原生而生的高效语言
    601 0
    |
    Cloud Native Java Go
    Go:为云原生而生的高效语言
    Go:为云原生而生的高效语言
    1737 0
    |
    编译器 Go
    揭秘 Go 语言中空结构体的强大用法
    Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
    |
    运维 监控 算法
    监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
    在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
    |
    Cloud Native 安全 Java
    Go:为云原生而生的高效语言
    Go:为云原生而生的高效语言
    837 1

    热门文章

    最新文章