Golang基础 流程控制 循环控制

2023-11-18

循环控制通常用于程序中需要重复执行的逻辑模块,循环结构通常由循环变量、循环终止条件和循环体三个部分构成。


01 基础循环 for

Golang 中所有的循环控制都使用 for 关键定义。基础 for 循环控制结构,可以执行指定次数的循环,一般形式是 for init; condition; post { body },其中:

  • init:一般为赋值表达式,给控制变量赋初值;
  • condition: 关系表达式或逻辑表达式,循环控制条件;
  • post: 一般为赋值表达式,给控制变量增量或减量
  • body:是需要重复执行的循环体代码

init 的循环变量同样存在作用域问题,在 for 循环中声明的变量仅在该循环体内有效,对外部变量没有影响;如果引用了外部声明的变量,则该循环变量具有更大的作用域。

func ForExp() {
    var i int = 10
    for i := 0; i < 9; i++ {
        fmt.Printf("%d ", i)
    }
    fmt.Printf(" global i: %d\n", i)
}

/* output:
0 1 2 3 4 5 6 7 8  global i: 10
*/

while 循环:Golang 中并没有 while 关键字,可以使用只有一个循环条件的 for 循环语句实现类似的功能,在循环体外部声明循环遍历,满足循环条件时循环执行循环体。

func ForExp() {
    var i int = 10
    for i > 0 {
        i--
        fmt.Printf("%d ", i)
    }
    fmt.Printf(" global i: %d\n", i)
}

/* output:
9 8 7 6 5 4 3 2 1 0  global i: 0
*/

无限循环:其他语言中无限循环大多使用 while(true) 实现,在 Golang 中使用不带循环变量和循环条件的 for{} 实现。无限循环在需要时可以使用 break 跳出循环。

func ForExp() {
    var i int = 10
    for {
        i--
        fmt.Printf("%d ", i)
        if i == 0 {
            break
        }
    }
    fmt.Printf(" global i: %d\n", i)
}

/* output:
9 8 7 6 5 4 3 2 1 0  global i: 0
*/

循环嵌套:在 for 循环中嵌套一个或多个 for 循环实现更复杂的循环执行逻辑。

循环嵌套中常常使用 goto、break、continue 三种循环控制关键字结合代码标签进行循环跳出或程序执行位置的调整

  • goto 语句通过标签进行代码间的无条件跳转,可以在快速跳出循环、避免重复退出上有一定的帮助。
  • break 语句可以结束 for、switch 和 select 的代码块;还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for、switch和select的代码块上。
  • continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用;在continue语句后添加标签时,表示开始标签对应的循环。
func ForExp() {
Prime: // 外层循环标签
    for i := 2; i < 100; i++ {
        j := 2
        for ; j <= (i / j); j++ {
            if i%j == 0 {
                break Prime // 退出循环到 Prime 之外
            }
        }
        if j > (i / j) {
            fmt.Printf("%d  是质数\n", i)
        }
    }
}

02 键值循环 for range

Golang 中提供 for range 遍历数组、切片、字符串、键值对(map)和通道(channel)等容器,不同容器的返回值也有所不同;对于仅需获得一个返回值的应用场景可以直接使用匿名变量 _ 接收不需要的返回值。

第一个返回值 第二个返回值
array/slice/string index s[index]
map key m[key]
channel element
  • 数组、切片、字符串返回索引和元素值
  • 键值对(map)返回键和值
  • 通道(channel)只返回通道内的值

遍历数组、切片和字符串for range 遍历数组、切片、字符串时,index 和 value 分别代表索引和索引值

func RangeExp() {
    var a = [5]int{1, 2, 3, 4, 5}
    var s []float32 = make([]float32, 3, 5)
    s = []float32{1.0, 2.0, 3.0}
    var str string = "hello,world!"
    fmt.Println("----------Array----------")
    for index, value := range a {
        fmt.Printf("index:%d, value:%d\n", index, value)
    }
    fmt.Println("----------Slice----------")
    for index, value := range s {
        fmt.Printf("index:%d, value:%f\n", index, value)
    }
    fmt.Println("----------String----------")
    for index, value := range str {
        fmt.Printf("index:%d, value:%c\n", index, value)
    }
}

/* output:
----------Array----------
index:0, value:1
index:1, value:2
index:2, value:3
index:3, value:4
index:4, value:5
----------Slice----------
index:0, value:1.000000
index:1, value:2.000000
index:2, value:3.000000
----------String----------
index:0, value:h
index:1, value:e
index:2, value:l
index:3, value:l
index:4, value:o
index:5, value:,
index:6, value:w
index:7, value:o
index:8, value:r
index:9, value:l
index:10, value:d
index:11, value:!
*/

遍历键值对 mapfor range 遍历键值对 Map 时,key 和 value 分别代表 map 的索引键 key 和索引对应的值 value。值得注意的是对 map 遍历时,遍历输出的键值是无序的,如果需要有序的键值对输出,需要对结果进行排序。

func RangeExp() {
    hash := map[int]string{
        1: "one",
        2: "two",
        3: "three",
    }
    fmt.Println("----------Map----------")
    for key, value := range hash {
        fmt.Printf("key:%d, value:%s\n", key, value)
    }
}

/* output:
----------Map----------
key:1, value:one
key:2, value:two
key:3, value:three
*/

遍历通道 channelfor range 遍历通道 channel 时,返回值只有一个,即管道内的类型对应的数据。

func RangeExp() {
    c := make(chan int)
    go func() {
        c <- 1
        c <- 2
        c <- 3
        close(c)
    }()
    fmt.Println("----------Channel----------")
    for value := range c {
        fmt.Printf("value:%d\n", value)
    }
}

/* output:
----------Channel----------
value:1
value:2
value:3
*/

参考资料

循环语句for · Go语言中文文档

循环语句range · Go语言中文文档

Go语言 if判断和for循环实战 goto使用的那些坑 - 掘金


如果文章对你有帮助,欢迎一键三连

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang基础 流程控制 循环控制 的相关文章

随机推荐

  • Git学习笔记【1】---本地操作

    声明 本教程参考自https www bilibili com video BV1Zz4y1C7vg p 17 一 Git的安装 官网下载即可 https git scm com 二 初始化本地仓库 1 创建一个文件夹 2 打开Git终端
  • Java常用System类

    java lang System类中提供了大量的静态方法 可以获取与系统相关的信息或系统级操作 在System类的API文档中 常用的方法有 public static long currentTimeMillis 返回以毫秒为单位的当前时
  • 移动互联网终端的touch事件,touchstart, touchend, touchmove

    前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP 这个页面上肯定是有很多可点击区域的 如果用户触摸到了那些可点击区域怎么办呢 诸如智能手机和平板电脑一类的移动设备通常会有一个电容式触摸屏 capacitive
  • 微信小游戏关系链能不能获取到服务器,关系链互动数据

    关系链互动数据 在开放 关系链数据能力 的基础上 小游戏新增 互动型托管数据 提供关系链互动能力 用于实现小游戏内微信好友互动 点赞 送礼物等 的功能 关系链互动数据能力支持 好友间互赠 50 种游戏内道具 提供成功互动后的主域回调 满足互
  • maven项目引入外部文件(资源)

    1 maven项目如何引入外部文件 maven项目一般在main目录下分为java和resources 前者是源码 后者是资源 含外部文件 在maven的pom xml中指定resources所在目录后 当maven编译时 resource
  • python3+requests:接口自动化测试(二)

    前言 上篇文章python3 requests unittest 接口自动化测试 一 已经介绍了基于unittest框架的实现接口自动化 但是也存在一些问题 比如最明显的测试数据和业务没有区分开 接口用例不便于管理等 所以又对此修改完善 接
  • OPENCV角点检测和亚像素级检测

    首先进行粗检测 函数goodFeaturesToTrack 存储进入corners中 然后cornerSubPix函数进行亚像素精确匹配 设置结束条件 由于实际应用中线条较粗 因此 CORNER BLOCKSIZE 9 CORNER QUA
  • STM32 ---deley延时两行代码实现【为方便移植文件】

    一 前提简述 优点 无需定时器 仅两行代码 缺点 不够精准 应用理由 很多文件移植后 发现delay都需要外部文件支持 那 不如在文件内定义一个 方便各文件移植 应用要求 STM32F103系列 默认72MHz系统时钟 任何一个工程 复制粘
  • ERP仓库管理系统需求

    ERP仓库管理系统需求 目录 1 系统管理 2 2 供货管理 12 3 仓库管理 24 4 出货管理 27 一 系统管理 1 输入账号 密码进入系统 功能 可能出现以下情况 1 1账号或密码错误 或者员工已经辞职离开 1 2账号不存在 1
  • 信号和槽

    信号和槽用于对象间的通讯 信号 槽机制是Qt的一个中心特征并且也许是Qt与 其它工具包的最不相同的部分 在图形用户界面编程中 我们经常希望一个窗口部件的一个变化被通知给另一个 窗口部件 更一般地 我们希望任何一类的对象可以和其它对象进行通讯
  • 网页按钮点击动画

    要求 一个按钮 每点击一次在大小可随时变化的按钮表面生成一个实心圆形 对每个圆形配置的时间 T T T 单位 毫秒 内有如下过程 第 i i i次点击生成一个圆形
  • 如何快速构建一个SpringBoot项目

    我们主要介绍如何快速构建一个SpringBoot项目 以此来提升日常开发效率 SpringBoot是搭建应用的手脚架 由Spring公司的核心团队在2013年开始研发 2014年4月发布第一个版本的全新开源的轻量级框架 它基于Spring4
  • Windows10系统自动登录

    1 打开注册表 在搜索框内 输入regedit 或者 注册表 2 找到 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Winlogon 3 添加新键 类型是字
  • openGL之API学习(二零三)GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T

    设置纹理坐标超出0 1范围时的处理方式 使用函数glTexParameteri 设置纹理参数 设置纹理参数 GL TEXTURE WRAP S 为 GL REPEAT 表示纹理X方向循环使用纹理 glTexParameteri GL TEX
  • 实际工作中的高级技术(训练加速、推理加速、深度学习自适应、对抗神经网络)

    目录 一 训练加速 1 基于数据的并行 Model Average 模型平均 SSGD 同步随机梯度下降
  • 大学生选课抢课如何提高选中概率

    作者位于哈尔滨某高校 选课总是激动人心的一件大事 但是明明与同学一起进的系统 他就能顺利选课 而我却被强退出来 无数辛酸让我知道了一些道理 写下这篇文章给学弟学妹们作为参考 原理 问 为什么大多数学校教务系统选课时都会卡 答 学校教务系统平
  • 热敏电阻测温

    热敏电阻器主要分为 PTC 和 NTC 正温度系数热敏电阻器 PTC 在温度越高时电阻值越大 负温度系数热敏电阻器 NTC 在温度越高时电阻值越低 它们同属于半导体器件 测温的热敏电阻一般为NTC 其主要参数有以下几个 标称阻值 标称阻值是
  • 期货有哪些(正规期货公司排名)

    期货有哪些 期货暂时重要分为两大版块 辨别是商品期货和金融期货 与此同声这两大版块又不妨辨别细化出各别的品种 商品期货又可细分为非金属商品 动力商品 农产物等 金融期货重要指保守的金融商品或东西 如一手一足 内债 税率 汇率等 商品期货农产
  • 58同城面经

    文章目录 58一面 58二面 58同城通过了技术面试 但迟迟没有hr面 可能表现的不是很好 58一面 自我介绍 数据结构大概有哪些分类 关于项目 为什么会考虑做商城项目 商城首页的优化 操作系统为什么会有线程这个操作吗 Java创建线程的方
  • Golang基础 流程控制 循环控制

    循环控制 01 基础循环 for 02 键值循环 for range 参考资料 循环控制通常用于程序中需要重复执行的逻辑模块 循环结构通常由循环变量 循环终止条件和循环体三个部分构成 01 基础循环 for Golang 中所有的循环控制都