golang容易掉进的坑(一)

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

案例一 switch-case会自动结束

下面这段代码会出现什么结果呢?

func test(a int) string {
    switch a {
    case 4:
    case 3:
        return "hit"
    }
    panic("noooo")
}

func main() {
    fmt.Println(test(4))
}
image.gif

如果在其它语言中,结果是打印出hit并结束程序,而在golang中将会产生panic异常!

原因是golang会在每个case结束时自动break掉,因此a=4时并不会return "hit"而是什么也不做。

对于这一点官方的解释是:

Go 的 switch 语句类似于 C、C++、Java、JavaScript 和 PHP 中的,不过 Go 只运行选定的 case,而非之后所有的 case。 实际上,Go 自动提供了在这些语言中每个 case 后面所需的 break 语句。 除非以 fallthrough 语句结束,否则分支会自动终止。

案例二 for循环时参数变化

func main() {
    a := []int{1,2,3,4}
    for i := range a {
        go func () {
            fmt.Println(i, a[i])
        }()
    }
    time.Sleep(1 * time.Second)
}
image.gif

以上代码在我本地运行,打出的是:

3 4
3 4
3 4
3 4
image.gif

这是由于在循环中位置变量i是唯一的,在循环中每次执行go fun()中使用到的i是同一个,在fmt.Println(i, a[i])时i值已经是不确定的。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:陀氏

查看原文:golang容易掉进的坑(一)

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

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