golang 常见“坑”(3)-switch - V2EX
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 3415 次点击
    这是一个创建于 2287 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上篇说到 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     Solana     949 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:22 PVG 06:22 LAX 14:22 JFK 17:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86