Go 之 Label 使用

本文详细介绍了Go语言中如何使用Label配合goto进行条件跳转,以及break和continue在控制循环结构中的应用,包括Label的声明位置、作用域限制和使用场景示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于好多其他不支持 Label 方式的语言来说,跳出多重循环是一件比较麻烦的事情。而 Go 支持 Label 方式跳转,且支持 goto 这种逆天跳转,对于多重循环跳转更是小菜一碟。简单来说,goto 语法让 Label 大放异彩。

在 Go 中使用 Label 需要配合 gotobreak,continue 来使用。

goto

使用 goto 语法的时候,是必须要结合 Label 使用的,语法也比较好理解,就是跳转到对应 Label 的地方继续执行。正因为 Label 配合 goto 使用的情况更多,所以相应的细节也会更多。

goto 必须配合 Label 使用

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1) // 1
	goto End
	fmt.Println(2) // 被跳过,不会执行
End:
	fmt.Println(3) // 3
}

Label 可以声明在函数体的任何地方

package main

import (
	"fmt"
)

func main() {
End:
	fmt.Println(1) // loop 1
	goto End
	fmt.Println(2)
	fmt.Println(3)
}

没在函数体中声明而直接使用的话,会导致未定义报错。

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1)
	goto End // label End not defined
	fmt.Println(2)
}

End: // syntax error: non-declaration statement outside function body
fmt.Println(3)

Label 在嵌套函数(闭包)也是不可用的 。

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1)
	func() {
		fmt.Println("Nested function")
		goto End // label End not defined
	}()
End: // label End defined and not used
	fmt.Println(2)
}

同一个函数作用域不能重复定义 Label

不能重复定义 Label,这个还是比较好理解,毕竟程序要的就是清晰明了。

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1)
	goto End

End: // label End already defined at .\main.go:11:1
	fmt.Println(2)
End:
	fmt.Println(3)
}

当然,如果本身就没在同个函数体内的话,名称相同也没什么影响(毕竟作用域是不一样的)。

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1)
	goto End

End:
	fmt.Println(2)
	test()
}

func test() {
	fmt.Println("test")
	goto End
End:
	fmt.Println("end")
}

Label 和变量名不冲突

毕竟 Label 和变量名的用途不一样,是不同的东西,所以相同名称并不会造成语法上的错误。

但是,尽管如此,不建议这么使用。

package main

import (
	"fmt"
)

func main() {
	x := 1
	fmt.Println(x)
	goto x
	fmt.Println(3)
x:
	fmt.Println(2)
}

变量的声明必须在 goto 之前

package main

import (
	"fmt"
)

func main() {
	goto End // goto End jumps over declaration of j
	j := 2
	fmt.Println(j)
End:
	fmt.Println(1)
}

break

break 单独使用的场景和其他语言并没有什么两样,都是跳出最近一层的循环。

break 携带 Label 可以用在 forswitchselect 上,且 Label 必须紧挨着他们。

简单来说,break 配合 Label 使用的时候,break 所在的 for,switch,select 要紧跟在 Label 的后面。

package main

func main() {
FirstLoop:
	for i := 0; i < 10; i++ { // invalid break label FirstLoop
	}
	for i := 0; i < 10; i++ {
		break FirstLoop
	}
}
package main

import "fmt"

func main() {
FirstLoop:
	j := 1
	switch j {
	case 0:
		fmt.Println(0)
	case 1:
		fmt.Println(1)
		break FirstLoop // invalid break label FirstLoop
	}
}

跳出多重 for 循环

package main

import "fmt"

func main() {
OuterLoop:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			fmt.Printf("i=%v, j=%v\n", i, j)
			if i == 1 && j == 1 {
				break OuterLoop
			}
		}
	}
	fmt.Println("end")
}
i=0, j=0
i=0, j=1
i=0, j=2
i=1, j=0
i=1, j=1
end

跳出 switch 

package main

import "fmt"

func main() {
SwitchStatement:
	switch 1 {
	case 1:
		fmt.Println(1) // 1
		for i := 0; i < 10; i++ {
			break SwitchStatement
		}
		fmt.Println(2) // 2
	}
	fmt.Println("end")
}

continue

continue 和 break 用法差不多。

package main

import "fmt"

func main() {
OuterLoop:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			fmt.Printf("i=%v, j=%v\n", i, j)
			if i == 1 {
				continue OuterLoop
			}
		}
	}
	fmt.Println("end")
}
i=0, j=0
i=0, j=1
i=0, j=2
i=1, j=0
i=2, j=0
i=2, j=1
i=2, j=2
end
Cadence学习篇中,你可以学习如何使用Cadence软件进行原理图PCB设计。引用中提到了一系列的学习篇文章,包括原理图工程创建、元器件绘制、PCB封装等内容。你可以通过查看这些文章来深入了解Cadence的使用方法。此外,引用中还提供了一些学习资源,包括学习视频参考博文,这些资源可以帮助你更好地掌握Cadence的功能技巧。如果你在使用Cadence过程中遇到了问题,可以参考引用中提供的解决方法步骤解决一些常见错误,比如"Cannot Initialize Profile"错误。通过学习实践,你将能够熟练使用Cadence进行电路设计仿真。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Cadence学习篇(12) Cadence中使用Pspice进行电路仿真](https://blog.csdn.net/qq_45138815/article/details/126086994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Candence学习篇(7)allegro pcb editor 17.2如何打开旧版本.brd.dra文件等](https://blog.csdn.net/qq_45138815/article/details/119941798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Cadence学习篇(1) Cadence原理图工程以及原理图库的创建](https://blog.csdn.net/qq_45138815/article/details/119825361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值