V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guonaihong
V2EX  ›  Go 编程语言

golang 常见“坑”(3)-switch

  •  
  •   guonaihong ·
    guonaihong · 2019-10-04 19:39:25 +08:00 · 3105 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上篇说到 go test -v 里面的隐藏“坑”,如果测试函数没有返回则 t.Errorf, t.Logf 之类函数是不会打印输出的。go test 的实现机制是 go test 里面的回调函数执行结束才会输出日志,如果你的测试依赖日志输出状态,可用 fmt.Printf 函数代替。这篇说下 switch 语句

    猜猜如下代码输出

    package main
    
    import (
            "fmt"
    )
    
    func main() {
            for i := 0; i < 5; i++ {
                    switch i {
                    case 3:
                            break
                    }
                    fmt.Printf("i = %d\n", i)
            }
    }
    
    

    如果你的猜测是

    i = 0
    i = 1
    i = 2
    

    可继续往下看 实际输出

    i = 0
    i = 1
    i = 2
    i = 3
    i = 4
    
    

    描述

    golang switch 里面不带标签的 break 好似没起任何作用。当然这个问题很好修改,break 后面带标签就行。

    改法

    package main
    
    import (
            "fmt"
    )
    
    func main() {
    exit:
            for i := 0; i < 5; i++ {
                    switch i {
                    case 3:
                            break exit
                    }
                    fmt.Printf("i = %d\n", i)
            }
    }
    
    

    我的 github

    https://github.com/guonaihong/gout

    lance6716
        1
    lance6716  
       2019-10-04 19:40:48 +08:00   ❤️ 1
    总不能不看官方文档,自己犯了错误就叫他坑吧
    guonaihong
        2
    guonaihong  
    OP
       2019-10-04 19:42:11 +08:00
    @lance6716 “坑”加双引号,只是想说下,这个设计和大多数人的预期不一样。
    frye
        3
    frye  
       2019-10-04 19:43:06 +08:00
    大哥,break 本来就是跳过 switch 块的,只是 golang 的 case 默认都带了一个 break 而已,这个是基本语法,不是坑吧?
    Daming
        4
    Daming  
       2019-10-04 19:48:48 +08:00 via Android
    这个不叫坑啊,什么语言 break 作用的也只是 switch 这一块,作用不到 for 循环。
    guonaihong
        5
    guonaihong  
    OP
       2019-10-04 19:52:05 +08:00
    @frye go switch 不需要写 break 还是挺迷惑的。不像 c 要时刻写 break,能记得 break 的作用范围。
    lincanbin
        6
    lincanbin  
       2019-10-04 19:57:29 +08:00 via Android
    大哥,break 本来就是退出当前流程控制块啊,这个没有问题,几乎所有语言的 break 都是这样的。
    guonaihong
        7
    guonaihong  
    OP
       2019-10-04 19:57:56 +08:00
    @Daming 其实我只是奇怪,在 go 里面 switch 是不需要写 break 的,假如用户写 break,目的很明确都是作用于 for。从实现上来看很容易和用户写的 break 作出区分。
    guonaihong
        8
    guonaihong  
    OP
       2019-10-04 20:00:53 +08:00
    @lincanbin 恩。。。
    codehz
        9
    codehz  
       2019-10-04 20:18:00 +08:00 via Android
    @guonaihong go 没返回值的函数也是不用写 return 的,情况类比,请
    guonaihong
        10
    guonaihong  
    OP
       2019-10-04 20:31:23 +08:00
    @codehz 听 codehz 兄一句话,感觉很受启发。
    reus
        11
    reus  
       2019-10-04 20:50:45 +08:00
    C, C++, C# 的 switch 都是要自己加 break 的,只有 go 是可以加可以不加……

    所以会被坑的,只有没学过 C, C++, C# 这类传统 C 类语言的……

    总感觉你这几个帖子所谓的“坑”,都只不过是你自己特有的。
    guonaihong
        12
    guonaihong  
    OP
       2019-10-04 21:06:53 +08:00
    @reus reus 兄所说不对。。。先不说本人写过 c/c++。。。为什么分享这些帖子,只是看到有童鞋踩过坑,想让更多的童鞋不要入此坑。。。此“自己”特有说法也不成立。
    KaynW
        13
    KaynW  
       2019-10-15 17:31:45 +08:00
    我就感觉 GO 不用写 Break 舒服,更符合直觉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2628 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.