Go 语言中有 goto
这个功能,这个功能会影响代码的可读性, 会让代码结构看起来比较乱。
Go语言也支持label(标签)语法:分别是break label
和 goto label
、continue label
最近有次阅读代码,就看到了这样的 case , 那就说一下这个功能吧。
goto
goto 可以无条件的跳转执行的位置,但是不能跨函数,需要配合标签使用。
package gotocase import ( "fmt" "testing" ) func TestGoto(t *testing.T) { fmt.Println(1) goto three //跳转 fmt.Println(2) // 这行将会被跳过 three: fmt.Println(3) }
执行结果如下:
=== RUN TestGoto 1 3 --- PASS: TestGoto (0.00s) PASS
goto
标签放上面,下面都可以的.
看下面的例子
func TestGoto1(t *testing.T) { one: fmt.Println(1) goto one //跳转 fmt.Println(2) // 这行将会被跳过 fmt.Println(3) }
执行结果, 不断循环打印。1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
break
break 一般用来跳出当前所在的循环, 但是我们有业务场景,需要使用到 跳出带外层循环怎么办?break label
跳出循环不再执行for循环里的代码。
可以使用 break 加标签的方式,举个例子。
func TestBreak(t *testing.T) { OUTER: for { fmt.Println(1) for { fmt.Println(2) break OUTER } } fmt.Println(3) }
break
标签只能用于for
循环,不能和switch
使用,在其他语言里switch
与break
是搭档
执行结果
=== RUN TestBreak 1 2 3 --- PASS: TestBreak (0.00s) PASS
这里要注意 一点break label,break
的跳转标签(label)必须放在循环语句for
前.
比如说, 下面的代码是不允许的
func TestBreak1(t *testing.T) { for { fmt.Println(1) for { fmt.Println(2) break OUTER } } OUTER: fmt.Println(3) }
IDE 也会告诉你异常
continue
continue label
这个功能和 break
优点类似,区别在于 break
是强制终止, continue
是继续循环下一个迭代。
看个用例:
func TestContinue(t *testing.T) { a := 10 Label: for a < 20 { if a == 15 { a++ //fmt.Println(a) continue Label } fmt.Println(a) a++ } }
执行结果:
=== RUN TestContinue 10 11 12 13 14 16 17 18 19 --- PASS: TestContinue (0.00s) PASS