为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 Go语言中的流程控制

Go语言中的流程控制

2019.01.01 20:04 548浏览


1 概述

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

2 条件分支 if

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

语法:

if 条件 1 {

  分支 1

} else if 条件 2 {

  分支 2

} else if 条件 ... {

  分支 ...

} else {

  分支 else

}

流程图:

if

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

3 状态分支 switch

3.1 基础

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

语法:

switch 分支测试表达式 {

case 状态1:

    分支1

case 状态2:

    分支2

case 状态...:

    分支...

default:

  分支 default

流程如下:

for

3.2 fallthrough,向下穿越

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

fallthrough 需要出现在分支语句块的最后一句!

语法:

switch 分支测试表达式 {

case 状态1:

    分支1

    fallthrough

case 状态2:

    分支2

    fallthrough

default:

  分支 default

流程如下:

switch-fallthrough

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)

}

流程如下:

for

4.2 省略语句

Go中允许省略三个语句中的任意,就是可以形成如下的语法:

仅存在条件语句,类似其他语言的 while 结构!

for 条件语句 {

  循环体

}

无限循环结构,死循环

for {

  循环体

}

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

for ; 条件语句; 条件变化语句 {

  循环体

}

for 初始化语句; 条件语句; {

  循环体

}

4.3 break

终止整个循环执行。

流程图如下:

for-break

4.4 continue

终止本次循环体的继续执行,进行循环条件变化。

流程如下:

for-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 执行是放在一个临时的调用栈中,因此是先入栈后出栈的。

流程图如下:

defer

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

完!

原文出自:小韩说课

微信关注:小韩说课

小韩说课

©著作权归作者所有:来自51CTO博客作者小韩说课的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
Go
0人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
手记
粉丝
237
获赞与收藏
986

关注TA,一起探索更多经验知识

同主题相似文章浏览排行榜

风间影月说签约讲师

51篇手记,涉及Java、MySQL、Redis、Spring等方向

进入讨论

Tony Bai 说签约讲师

151篇手记,涉及Go、C、Java、Python等方向

进入讨论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消