Golang中Label的用法
在Golang中能使用Label的有goto, break, continue.,这篇文章就介绍下Golang中Label使用和注意点.
注意点:
Label在continue, break中是可选的, 但是在goto中是必须的- 作用范围: 定义
Label的函数体内. Label可以声明在函数体的任何位置, 不管Label声明在调用点的前面还是后面.
一. goto
下面就以goto为例子展示上面三点特点.
1.Label在goto是必须的
package main import (
"fmt"
) func main() {
fmt.Println(1)
goto End
//goto 10: syntax error: unexpected . at end of statement
fmt.Println(2)
End:
fmt.Println(3)
}
输出
Output:
1
3
2.Label可以声明在函数体的任何地方
package main import (
"fmt"
) func main() {
End:
fmt.Println(1)
goto End
fmt.Println(2)
fmt.Println(3)
}
输出
Output
1
1
1
....
3.Label的作用范围是在函数体中
package main import (
"fmt"
) func main() {
fmt.Println(1)
goto End
fmt.Println(2)
} End:
fmt.Println(3)
输出
Output:
syntax error: non-declaration statement outside function body
4.Label在嵌套函数(闭包)是不可用的. 不管是在闭包里调用闭包外的Label, 还是在闭包外调用闭包里的Label
package main import (
"fmt"
) func main() {
fmt.Println(1)
func() {
fmt.Println("Nested function")
goto End
}()
End:
fmt.Println(2)
}
输出
Output
11:label End not defined
13:label End defined and not used
5.不能重复定义Label
package main import (
"fmt"
) func main() {
fmt.Println(1)
goto End End
fmt.Println(2)
{
End:
fmt.Println(3)
}
}
输出
Output
14: label End already defined at ./label.go:11
6.Label和变量名是不冲突的, 可以定义一个名为x的变量和名为x的Label(不过不建议这么用, 这么写会被人骂的); 而且Label是区分大小写的.
package main import (
"fmt"
) func main() {
x := 1
fmt.Println(x)
goto x
x:
fmt.Println(2)
}
输出
Output:
1
2
7.变量的声明必须在goto之前.
package main import (
"fmt"
) func main() {
goto End
j := 2
fmt.Println(j)
End:
fmt.Println(1)
}
输出
Output
goto End jumps over declaration of i at ./label.go:9
这是为什么呢? 因为任何变量的声明都不能被跳过.
需要改成下面的形式
package main import (
"fmt"
) func main() {
j := 2
goto End
fmt.Println(j)
End:
fmt.Println(2)
}
二. break(不带label)
break一般用来跳出最近一层的switch和for, 注意不能用在select上
1.单层循环
package main import (
"fmt"
) func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
if i == 3 {
break
}
}
}
输出
Output
0
1
2
3
2.双层循环
package main import (
"fmt"
) func main() {
for i := 0; i < 3; i++ {
for j := 0; j < 5; j++ {
fmt.Println("i:", i, ",j:", j)
if j == 2 {
break
}
}
}
}
输出
Output
i: 0 ,j: 0
i: 0 ,j: 1
i: 0 ,j: 2
i: 1 ,j: 0
i: 1 ,j: 1
i: 1 ,j: 2
i: 2 ,j: 0
i: 2 ,j: 1
i: 2 ,j: 2
从这个例子可以看出break只能跳出最近for
3.对于c/c++来说, switch/case一般都是配合break来使用的.但是在golang中switch/case不需要break就能够实现和c/c++一样的效果.
package main import (
"fmt"
) func main() {
i := 1
switch {
case i == 0:
fmt.Println(i)
case i == 1:
fmt.Println(i)
//break 这里可以使用`break`,但是么有啥效果, 不如不写
case i == 2:
fmt.Println(i)
}
}
输出
Output
1
如果想继续往下执行, 需要使用fallthrough
package main import (
"fmt"
) func main() {
i := 1
switch {
case i == 0:
fmt.Println(0)
case i == 1:
fmt.Println(1)
fallthrough
case i == 2:
fmt.Println(2)
}
}
输出
Output:
1
2
4.break在函数里是不起作用的, 不能传递出来.
package main
func f() {
break
}
func main() {
for i := 0; i < 10; i++ {
f()
}
}
输出
output
4: break is not in a loop
三.break(Label)
break携带label可以用在for,switch,select上.
1.对于for/select /switch ,Label必须紧挨着他们.
FirstLoop:
for i := 0; i < 10; i++ { //invalid break label FirstLoop
}
for i := 0; i < 10; i++ {
break FirstLoop
}
必须改成这样
func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
FirstLoop:
for i := 0; i < 10; i++ {
break FirstLoop
}
}
对于select和switch也是一样.
func main() {
FirstLoop:
j := 1
switch j {
case 0:
fmt.Println(0)
case 1:
fmt.Println(1)
break FirstLoop // invalid break label FirstLoop
}
}
2.一般来说break只能跳出最近一层的for, switch, 但是break Label就可以直接跳出最外面的循环.
func main() {
OuterLoop:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
fmt.Printf("i=%v, j=%v\n", i, j)
break OuterLoop
}
}
}
Output
i=0, j=0
输出
SwitchStatement:
switch 1 {
case 1:
fmt.Println(1)
for i := 0; i < 10; i++ {
break SwitchStatement
}
fmt.Println(2)
}
fmt.Println(3)
输出
Output
1
3
四. continue
continue用法基本上和break差不多.1.正常的用法, 调过当前循环, 继续执行下一次
package main import (
"fmt"
) func main() {
for i := 0; i < 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}
输出
Output
0
1
2
4
2.continue和label一起使用(其实和不使用Label效果一样)
func main() {
Test:
for i := 0; i < 5; i++ {
if i == 3 {
continue Test
}
fmt.Println(i)
}
}
输出
Output
0
1
2
4
3.continue和双层循环一起使用
OuterLoop:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
fmt.Printf(“i=%v, j=%v\n”, i, j)
continue OuterLoop
}
}
输出
Output
i=0, j=0
i=1, j=0
i=2, j=0
Golang中Label的用法的更多相关文章
- golang中type常用用法
golang中,type是非常重要的关键字,一般常见用法就是定义结构,接口等,但是type还有很多其它的用法,在学习中遇到了以下几种,这点简单总结记录下 定义结构 type Person struct ...
- golang 中strconv包用法
链接:https://studygolang.com/articles/5003 http://www.cnblogs.com/golove/p/3262925.html
- Golang中的RegExp正则表达式用法指南
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- golang中的reflect包用法
最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...
- java中this的用法?
2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ...
- JAVA语言中冒号的用法
近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...
- golang 的 http cookie 用法
golang的http cookie用法 在服务端程序开发的过程中,cookie经常被用于验证用户登录.golang 的 net/http 包中自带 http cookie的定义,下面就来讲一下coo ...
- Golang 中的坑 一
Golang 中的坑 短变量声明 Short variable declarations 考虑如下代码: package main import ( "errors" " ...
随机推荐
- numpy基础教程--where函数的使用
在numpy中,where函数是一个三元运算符,函数原型为where(condition, x, y),意思是当条件成立的时候,将矩阵的值设置为x,否则设置为y 一个很简单的应用就是,在一个矩阵当中, ...
- HCL华三模拟器静态路由实验
(copy自我的其他博客网站) 拓扑如下: 实验目的:通过给A.B.C三台路由器配置静态路由,使PC1可以ping通PC2. 实验环境:Windows10 (21H1),HCL(V3.0.1) 实验步 ...
- .gitignore文件作用
目录 一.简介 二.常用规则 三.详细 一.简介 一般来说每个Git项目中都需要一个.gitignore文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中. 意思就是本地修改完项目后,上 ...
- Linux下安装Calibre
目录 一.介绍 二.安装 三.测试 四.报错处理 一.介绍 Calibre是基于python的电子书制作软件,可导出PDF.EPUB.MOBI.Word格式电子书. 二.安装 yum -y insta ...
- Linux 文件属性及详细操作
目录 Linux 文件属性 文件属性信息组成 文件属性概念说明 文件软硬链接说明 硬链接 软链接 补充知识 存储数据相关-inode/block inode: block: 读取文件原理图 Linux ...
- Windows Terminal 终端 SSH连接centos7 linux
1.在Windows Store中安装 Windows Terminal 2.打开Windows Terminal,使用下拉箭头,打开设置. 3.在左侧点击"添加新配置文件",再点 ...
- Spring Security Filter 学习笔记
过滤器可以简单理解成用于拦截请求,并执行相应逻辑的代码. 在Spring Security架构中实现过滤器 在SpringSecurity中,可以通过实现 javax.servlet 包中的 Filt ...
- 通过css实现表格的斜线
效果图 实现思路 编辑一个svg文件,可以自定义线条颜色和粗细. 将svg文件转为base64格式,作为背景图属性设置. svg转base64的网址:https://www.sojson.com/im ...
- C++ 获取函数耗时
C++ 记录耗时 #include <sys/timeb.h> #include <stdio.h> long long getSystemTime() { struct ti ...
- Lucky Substrings
而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...