0
点赞
收藏
分享

微信扫一扫

Go 语言中的 label 使用

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 也会告诉你异常Go 语言中的 label 使用_for循环

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

获得更多内容,关注公众号程序员财富自由之路

Go 语言中的 label 使用_公众号_02

公众号:程序员财富自由之路


关注我们,了解更多



参考资料

  • ​​https://www.pianshen.com/article/56561351087/​​
  • ​​https://sherlockgy.github.io/2019/01/13/Go%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%97%8512%E2%80%94%E2%80%94goto%E5%92%8C%E6%A0%87%E7%AD%BE/​​


举报

相关推荐

0 条评论