Go 之 Label 使用

对于好多其他不支持 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

相关推荐

  1. Go Label 使用

    2024-04-24 19:40:05       33 阅读
  2. WPFLabel

    2024-04-24 19:40:05       33 阅读
  3. Go 小知识 Go 中如何使用 set

    2024-04-24 19:40:05       58 阅读
  4. HTML中label是什么,怎么使用

    2024-04-24 19:40:05       30 阅读
  5. label 的作用是什么?如何使用

    2024-04-24 19:40:05       34 阅读
  6. Go语法函数 defer使用

    2024-04-24 19:40:05       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 19:40:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 19:40:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 19:40:05       82 阅读
  4. Python语言-面向对象

    2024-04-24 19:40:05       91 阅读

热门阅读

  1. 通过Redis实现一个异步请求-响应程序

    2024-04-24 19:40:05       31 阅读
  2. 京东商品详情API:电商创新的利器

    2024-04-24 19:40:05       32 阅读
  3. L2-3 满树的遍历

    2024-04-24 19:40:05       36 阅读
  4. 2024年货运从业资格考试题库及答案

    2024-04-24 19:40:05       37 阅读
  5. PHP中的会话管理是如何工作的?

    2024-04-24 19:40:05       25 阅读
  6. 如何防止SQL注入攻击?

    2024-04-24 19:40:05       30 阅读
  7. 2024年最重要的AI趋势

    2024-04-24 19:40:05       29 阅读
  8. 【Linux】解决切换用户出现bash-4.2$问题

    2024-04-24 19:40:05       28 阅读
  9. 网络安全之数据库基础篇(基础入门)

    2024-04-24 19:40:05       32 阅读