分享
  1. 首页
  2. 文章

Go语言中的流程控制

小韩说课 · · 2098 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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语言中的流程控制

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2098 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏