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


    目录
    相关文章
    |
    7天前
    |
    Go 索引
    go语言中的循环语句
    【11月更文挑战第4天】
    18 2
    |
    7天前
    |
    Go C++
    go语言中的条件语句
    【11月更文挑战第4天】
    20 2
    |
    7天前
    |
    Go
    go语言中的 跳转语句
    【11月更文挑战第4天】
    16 4
    |
    7天前
    |
    JSON 安全 Go
    Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
    本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
    39 1
    |
    9天前
    |
    存储 JSON 监控
    Viper,一个Go语言配置管理神器!
    Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
    29 2
    |
    13天前
    |
    JavaScript Java Go
    探索Go语言在微服务架构中的优势
    在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
    107 53
    |
    12天前
    |
    Ubuntu 编译器 Linux
    go语言中SQLite3驱动安装
    【11月更文挑战第2天】
    36 7
    |
    12天前
    |
    关系型数据库 Go 网络安全
    go语言中PostgreSQL驱动安装
    【11月更文挑战第2天】
    45 5
    |
    12天前
    |
    安全 Go
    用 Zap 轻松搞定 Go 语言中的结构化日志
    在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
    31 1
    |
    11天前
    |
    程序员 Go
    go语言中的控制结构
    【11月更文挑战第3天】
    87 58