Go基础:range、循环控制Goto、Break、Continue

简介: Go基础:range、循环控制Goto、Break、Continue

 range

Golang range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}

image.gif

1st value 2nd value
string index s[index] unicode, rune
array/slice index s[index]
map key m[key]
channel element

可忽略不想要的返回值,或 "_" 这个特殊变量。

package main
func main() {
  s := "abc"
  // 忽略 2nd value,支持 string/array/slice/map。
  println("忽略 2nd value,支持 string/array/slice/map")
  for i := range s {
    println(s[i])
  }
  // 忽略 index。
  println("忽略 index")
  for _, c := range s {
    println(c)
  }
  // 忽略全部返回值,仅迭代。
  println("忽略全部返回值,仅迭代")
  for range s {
  }
  m := map[string]int{"a": 1, "b": 2}
  // 返回 (key, value)。
  println("map返回 (key, value)")
  for k, v := range m {
    println(k, v)
  }
  // 返回结果
  //忽略 2nd value,支持 string/array/slice/map
  //97
  //98
  //99
  //忽略 index
  //97
  //98
  //99
  //忽略全部返回值,仅迭代
  //map返回 (key, value)
  //a 1
  //b 2
}

image.gif

注意,range 会复制对象。

package main
import "fmt"
func main() {
    a := [3]int{0, 1, 2}
    for i, v := range a { // index、value 都是从复制品中取出。
        if i == 0 { // 在修改前,我们先修改原数组。
            a[1], a[2] = 999, 999
            fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。
        }
        a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。
    }
    fmt.Println(a) // 输出 [100, 101, 102]。
}

image.gif

输出结果:

[0 999 999]
    [100 101 102]

image.gif

建议改用引用类型,其底层数据不会被复制。

package main
func main() {
    s := []int{1, 2, 3, 4, 5}
    for i, v := range s { // 复制 struct slice { pointer, len, cap }。
        if i == 0 {
            s = s[:3]  // 对 slice 的修改,不会影响 range。
            s[2] = 100 // 对底层数据的修改。
        }
        println(i, v)
    }
}

image.gif

另外两种引用类型 map、channel 是指针包装,而不像 slice 是 struct。

for 和 for range有什么区别?

主要是使用场景不同

for可以

遍历array和slice

遍历key为整型递增的map

遍历string

for range可以完成所有for可以做的事情,却能做到for不能做的,包括

遍历key为string类型的map并同时获取key和value

遍历channel

循环控制Goto、Break、Continue

循环控制语句

循环控制语句可以控制循环体内语句的执行过程。

GO 语言支持以下几种循环控制语句:

1.1.1. Goto、Break、Continue

    1. 三个语句都可以配合标签(label)使用
    2. 标签名区分大小写,定以后若不使用会造成编译错误
    3. continue、break配合标签(label)可用于多层循环跳出
    4. goto是调整执行位置,与continue、break配合标签(label)的结果并不相同

    参考链接:

    循环控制Goto、Break、Continue · Go语言中文文档

    目录
    相关文章
    |
    7天前
    |
    存储 JSON 监控
    Viper,一个Go语言配置管理神器!
    Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
    26 2
    |
    11天前
    |
    JavaScript Java Go
    探索Go语言在微服务架构中的优势
    在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
    103 53
    |
    6天前
    |
    Go 索引
    go语言中的循环语句
    【11月更文挑战第4天】
    15 2
    |
    6天前
    |
    Go C++
    go语言中的条件语句
    【11月更文挑战第4天】
    19 2
    |
    10天前
    |
    Ubuntu 编译器 Linux
    go语言中SQLite3驱动安装
    【11月更文挑战第2天】
    33 7
    |
    11天前
    |
    关系型数据库 Go 网络安全
    go语言中PostgreSQL驱动安装
    【11月更文挑战第2天】
    42 5
    |
    10天前
    |
    安全 Go
    用 Zap 轻松搞定 Go 语言中的结构化日志
    在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
    28 1
    |
    9天前
    |
    程序员 Go
    go语言中的控制结构
    【11月更文挑战第3天】
    86 58
    |
    8天前
    |
    监控 Go API
    Go语言在微服务架构中的应用实践
    在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
    |
    10天前
    |
    存储 编译器 Go
    go语言中的变量、常量、数据类型
    【11月更文挑战第3天】
    27 9