1 概述

Go语言提供了条件分支 if,状态分支 switch,循环 for,跳转 goto,延迟执行 defer,这些流程控制语句。分别作说明如下:

2 条件分支 if

依据条件是否满足确定执行哪个分支。
语法:

if 条件 1 {
分支 1
} else if 条件 2 {
分支 2
} else if 条件 ... {
分支 ...
} else {
分支 else
}

流程图:

Go是强类型,要求条件表达式严格返回布尔型数据!

3 状态分支 switch

3.1 基础

状态分支,依据特定的状态值进行分支判断。
语法:

switch 分支测试表达式 {
case 状态1:
分支1
case 状态2:
分支2
case 状态...:
分支...
default:
分支 default
}

流程如下:

3.2 fallthrough,向下穿越

在其他语法(非Go,C,PHP)中,switch 有一个特定的现象,就是向下穿越,指的是一旦一个分支 case 满足,则后续分支代码都会被执行。而Go语言中,默认分支执行完毕,switch 执行完毕。使用 fallthrough 语法,可以达到穿越下一个 case 分支的目的。
fallthrough 需要出现在分支语句块的最后一句!
语法:

switch 分支测试表达式 {
case 状态1:
分支1
fallthrough
case 状态2:
分支2
fallthrough
default:
分支 default
}

流程如下:

3.3 条件型 switch

示例代码,逻辑与 if-else-if 一致:

score := 89
switch {
case score >= 90:
fmt.Println("优秀,不错")
case score >= 80:
fmt.Println("还行吧")
default:
fmt.Println("呵呵")
}

个人感觉失去了 switch 分支的意义哈!

4 循环for

4.1 基本

语法格式:

for 初始化语句; 条件语句; 条件变化语句 {
循环体
} // 输出1-10
for i := 1; i <= 10; i++ {
fmt.Println(i)
}

流程如下:

4.2 省略语句

Go中允许省略三个语句中的任意,就是可以形成如下的语法:
仅存在条件语句,类似其他语言的 while 结构!

for 条件语句 {
循环体
}

无限循环结构,死循环

for {
循环体
}

其他结构,三个语句可以任意省略,不再列举:

for ; 条件语句; 条件变化语句 {
循环体
}
for 初始化语句; 条件语句; {
循环体
}

4.3 break

终止整个循环执行。
流程图如下:

4.4 continue

终止本次循环体的继续执行,进行循环条件变化。
流程如下:

4.5 嵌套循环

语法:

for {
for { }
}

在使用 break,continue 时,若需要终止外层循环 for,需要配合语句标签使用,演示如下:

userLabel:
for {
for {
break userLabel
或者
continue userLabel
}
}

额外注意,switch 在语言中,被视为执行一次的循环结构,因此 switch 中若要终止外层循环,需要使用标签语法,不能直接 break、continue,演示如下:

userLabel:
for {
swtich variable {
case "exit"
break userLabel
或者
continue userLabel
}
}

5 goto

配合标签完成无条件跳转。演示如下:

if error {
goto doError
} // 其他业务逻辑代码略 doError:
fmt.Println(errorInfo)

6 延迟执行defer

defer 语句会将其后语句进行延迟处理。在 defer 所属函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。演示如下:

 func main() {
fmt.Println("before defer")
defer fmt.Println("defer A")
defer fmt.Println("defer B")
defer fmt.Println("defer C")
fmt.Println("after defer")
}
以上代码的执行结果:
before defer
after defer
defer C
defer B
defer A

defer 执行是放在一个临时的调用栈中,因此是先入栈后出栈的。
流程图如下:

实操时,处理互斥所时,很常用!

完!
原文出自:小韩说课
微信关注:小韩说课

Go语言中的流程控制的更多相关文章

  1. Go语言基础之流程控制

    Go语言基础之流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用额流程控制有if和for,而switch和goto主要是为了简化代 ...

  2. Python基础之:Python中的流程控制

    目录 简介 while语句 if 语句 for语句 Break Continue pass 简介 流程控制无非就是if else之类的控制语句,今天我们来看一下Python中的流程控制会有什么不太一样 ...

  3. GO语言学习——Go语言基础之流程控制一

    Go语言基础之流程控制 if else(分支结构) package main import "fmt" // if条件判断 func main(){ // age := 19 // ...

  4. Java中的流程控制(三)

    关于Java中的流程控制 关于Java中的流程控制 4.do while语句 do while语句的功能和while语句差不多,只不过它是在执行完第一次循环后才检测条件表达式的值,这意味着包含在大括号 ...

  5. Go语言 数据类型,流程控制

    Go语言 数据类型,流程控制 人生苦短,Let's Go ! package main // 必须要有一个main包 import "fmt" func main() { fmt. ...

  6. python中的流程控制

    目录 引言 流程控制的分类 分支结构 单if结构 if与else结构 if与elif与else结构 if分支的嵌套 循环结构 while循环 while + break循环 while + conti ...

  7. 第三章 go语言 程序的流程控制

    程序的流程控制主要包括三种不同的结构,分别是顺序结构.选择结构和循环结构. ² 顺序结构最为简单,程序执行时,按照语句的顺序自上而下依次执行. ² 选择结构是根据条件表达式的结果选择执行某些语句. ² ...

  8. Go语言学习笔记-流程控制(二)

    Go语言流程控制 字典类型Map 1.上节遗留:map字典类型 变量声明:var myMap map[string] PersonInfo 其中,myMap是变量名,string是键的类型,Perso ...

  9. 1.4 Go语言基础之流程控制

    流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...

随机推荐

  1. 《C++ Primer Plus》读书笔记之——处理数据

    本文旨在记录在阅读<C++ Primer Plus>第五版的过程中,一些重点的知识点,方便以后查阅.本文将不断更新...... 一.第三章 处理数据 1.无符号整型不能存储负数值,其优点是 ...

  2. css如何制作八边形

    随着技术的发展,css也越发强大,css可以制作很多有趣的图形,让我们一起来看一下如何使用css制作一个八边形吧.   方法/步骤     1新建一个html文件.如图:   在html文件上创建一个 ...

  3. Simotion 绝对值编码器使用外部开关回零

    问题来源: 西门子的1FK7二代电机,目前已经没有增量编码器.标准的编码器选项是单圈绝对值,或多圈绝对值. 在某些应用中,如印刷机的版辊.模切轴.飞剪电机等,需要使用外部开关来回零.下文描述了使用外部 ...

  4. iotop使用详解

    iotop是top和iostat程序的混合体,能够显示系统中所有运行进程并将进程根据I/O统计信息排序. 这个软件使用了Linux内核的一些新特性,所以需要2.6.20或者更新的内核. 一般默认情况下 ...

  5. 025__name__变量和目录结构规范

    ##__name__变量被其他模块调用的时候就不是main,所以就有这种使用if __name__=='__main__': ##软件目录结构规范为什么要设计好目录结构?"设计项目目录结构& ...

  6. python UI自动化实战记录九:添加日志

    想知道测试脚本运行到了哪一步,在脚本内关键节点处打日志是一个很好的方法.目前只写最简单的方式,logging相关还需要继续深入. 1  引包,并配置info级别以上的都显示 import loggin ...

  7. c++内存区域结构及堆栈的一些知识

    一.c++在内存区域的分配图 可以看出,对于Linux系统下的,存储空间的分配有着较为层次清晰的分层.单片机大概也遵循这个分区架构. 二进制代码以及常量(CONST修饰)以及全局变量在最底层,存储空间 ...

  8. MATLAB入门学习(整合)

    整合一下,都是链接地址: MATLAB入门学习(一):初次使用.. MATLAB入门学习(二):矩阵相关 MATLAB入门学习(三):矩阵常用函数 MATLAB入门学习(四):编写简单.m文件和函数文 ...

  9. 将POST请求转换为DELETE、PUT等请求的方法

    一.在WEB工程的web.xml文件中配置HiddenHttpMethodFilter 二.form 表单中添加一个隐藏域 name="_method" value="D ...

  10. react 开发中的问题简记

    1.什么时候用props 什么时候用state ? 不能使用props:当页面组件存在URL跳转问题时候,原因:若单独刷新,他会报错,拿不到前面的数据: 使用props场景:当组件为页面组件的一部分即 ...