Go 语言中的label使用

3,276 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

Go 语言中有 goto 这个功能,这个功能会影响代码的可读性,会让代码结构看起来比较乱。但是在处理多级嵌套时又非常有用。

最近有次阅读代码,就看到了这样的 case , 那就说一下这个功能吧。

Go语言也支持label(标签)语法:分别是break labelgoto labelcontinue label

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使用,在其他语言里switchbreak是搭档

执行结果

=== 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

欢迎关注工作号:程序员财富自由之路