Go语言学习 Day08(标签与goto)

Go语言学习 Day08(标签与goto)

Scroll Down

Go语言学习 Day08(标签与goto)

原文地址

原文地址(书籍翻译)

学习地址(项目地址)


forswitchselect 语句都可以配合标签(label)形式的标识符来使用,即某一行的第一个以冒号(:)结尾的单词。

标签的名称都是大小写敏感的,一般建议使用全部大写字母。

func main(){
	LABEL1:
		for i:=0;i<5;i++{
			for j:=5;j>=0;j--{
				if j == 2{
					fmt.Printf("The number i is:%d ,The number j is:%d \n",i,j)
					continue LABEL1
				}
			}
			fmt.Printf("The number i is :%d \n",i)
		}
}

输出:

The number i is:0 ,The number j is:2 
The number i is:1 ,The number j is:2 
The number i is:2 ,The number j is:2 
The number i is:3 ,The number j is:2 
The number i is:4 ,The number j is:2 

continue指向了LABEL1,当执行到该语句时,就会跳转到LABEL1标签的位置。

标签的作用对象为外部循环,因此i会直接变成下一个循环的值,而j会被重设为0,即它的初始值。如果把continue改成break,则会直接退出外层循环。


还可以使用goto 和 标签来配合使用模拟循环。

func main(){
	i:= 0
	LABEL1:
		i++
		if i == 8{
			fmt.Printf("The i is :%d \n",i)
			return
		}
		goto LABEL1
}

当使用正序的标签时(标签位于goto语句之后),注意标签与goto语句之间不能出现定义新变量的语句, 否则会导致编译失败。反序则正常通过。

正序:

func main(){
	a := 1
	goto TARGET // compile error(TARGET jumps over declaration of b)
	b := 9
TARGET:
	b += a
	fmt.Printf("a is %v *** b is %v", a, b)
}

反序:

func main(){
	j := 0
	LABEL1:
		j++
		i := 2
		fmt.Printf("The i is :%d,The j is:%d \n",i,j)
		if j == 5{
			return
		}
		goto LABEL1
}