分享
golang之流程控制(注意点)
pyyu · · 1980 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
Go在流程控制方面特点如下:
- 没有do和while循环,只有一个广义的for语句
- switch语句灵活多变,还可以用于类型判断
- if语句和switch语句都可以包含一条初始化子语句
- break语句和continue语句可以跟一条label标签语句,用于标识需要终止或继续的代码块
- defer语句可以使我们更加方便地执行异常捕获和资源回收任务
- select语句也可以用于多分支选择,但只与通道配合使用
- go语句用于异步启动goroutine并执行指定函数
for range 注意点:
- 对数组、切片或者字符串值进行迭代,:=左边只有一个迭代变量时,要注意只能得到元素的索引,而不是元素。
- 迭代没有任何元素的数组值、为nil的切片值、为nil的字典值、为""的字符串值,不会执行for语句中的代码。for在一开始就会结束。因为这些值长度是0
- 迭代为nil的通道值会让当前流程永远阻塞在for语句上。
defer 控制语句
package main import ( "fmt" ) //outerFunc是外围函数 //defer执行顺序是,先进后出,延迟调用指定的函数 //当外围函数中语句执行完毕时,只有延迟函数都执行完毕,外围函数才真的结束 //当执行外媒函数中的return时,只有延迟函数都执行完毕,外围函数才返回 //当外围函数中的代码引发运行错误时,只有延迟函数执行完毕,运行时的错误才会被扩散至调用函数。 //因此defer常用在执行释放资源或异常处理等收尾任务 //defer语句在外围函数体中位置不限,数量不限 func printNumbers() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func() { fmt.Printf("%d", i) }() } } func printNumbers1() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i) } } func printNumbers2() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i * 2) } } func main() { printNumbers() fmt.Println() printNumbers1() fmt.Println() printNumbers2() }
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1980 次点击
上一篇:golang test模块
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
Go在流程控制方面特点如下:
- 没有do和while循环,只有一个广义的for语句
- switch语句灵活多变,还可以用于类型判断
- if语句和switch语句都可以包含一条初始化子语句
- break语句和continue语句可以跟一条label标签语句,用于标识需要终止或继续的代码块
- defer语句可以使我们更加方便地执行异常捕获和资源回收任务
- select语句也可以用于多分支选择,但只与通道配合使用
- go语句用于异步启动goroutine并执行指定函数
for range 注意点:
- 对数组、切片或者字符串值进行迭代,:=左边只有一个迭代变量时,要注意只能得到元素的索引,而不是元素。
- 迭代没有任何元素的数组值、为nil的切片值、为nil的字典值、为""的字符串值,不会执行for语句中的代码。for在一开始就会结束。因为这些值长度是0
- 迭代为nil的通道值会让当前流程永远阻塞在for语句上。
defer 控制语句
package main import ( "fmt" ) //outerFunc是外围函数 //defer执行顺序是,先进后出,延迟调用指定的函数 //当外围函数中语句执行完毕时,只有延迟函数都执行完毕,外围函数才真的结束 //当执行外媒函数中的return时,只有延迟函数都执行完毕,外围函数才返回 //当外围函数中的代码引发运行错误时,只有延迟函数执行完毕,运行时的错误才会被扩散至调用函数。 //因此defer常用在执行释放资源或异常处理等收尾任务 //defer语句在外围函数体中位置不限,数量不限 func printNumbers() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func() { fmt.Printf("%d", i) }() } } func printNumbers1() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i) } } func printNumbers2() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i * 2) } } func main() { printNumbers() fmt.Println() printNumbers1() fmt.Println() printNumbers2() }