Go 语言中有 goto 这个功能,这个功能会影响代码的可读性, 会让代码结构看起来比较乱。
Go语言也支持label(标签)语法:分别是break label和 goto label 、continue label
最近有次阅读代码,就看到了这样的 case , 那就说一下这个功能吧。
gotogoto 可以无条件地跳转执行的位置,但是不能跨函数,需要配合标签使用。
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 也会告诉你异常
continuecontinue 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
欢迎关注公众号:程序员财富自由之路
在这里插入图片描述
参考资料- https://www.pianshen.com/article/56561351087/
- https://sherlockgy.github.io/2019/01/13/Go语言学习之旅12——goto和标签/