前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang之流程控制(注意点)

golang之流程控制(注意点)

作者头像
超蛋lhy
发布2018-08-31 16:36:03
4110
发布2018-08-31 16:36:03
举报
文章被收录于专栏:PythonistaPythonista

Go在流程控制方面特点如下:

  • 没有do和while循环,只有一个广义的for语句
  • switch语句灵活多变,还可以用于类型判断
  • if语句和switch语句都可以包含一条初始化子语句
  • break语句和continue语句可以跟一条label标签语句,用于标识需要终止或继续的代码块
  • defer语句可以使我们更加方便地执行异常捕获和资源回收任务
  • select语句也可以用于多分支选择,但只与通道配合使用
  • go语句用于异步启动goroutine并执行指定函数

for range 注意点:

  • 对数组、切片或者字符串值进行迭代,:=左边只有一个迭代变量时,要注意只能得到元素的索引,而不是元素。
  • 迭代没有任何元素的数组值、为nil的切片值、为nil的字典值、为“”的字符串值,不会执行for语句中的代码。for在一开始就会结束。因为这些值长度是0
  • 迭代为nil的通道值会让当前流程永远阻塞在for语句上。

defer 控制语句

代码语言:javascript
复制
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()
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go在流程控制方面特点如下:
  • for range 注意点:
  • defer 控制语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档