在Golang中能使用Label的有gotobreakcontinue.,这篇文章就介绍下Golang中Label使用和注意点.

注意点:

  1. Label在continue, break中是可选的, 但是在goto中是必须的
  2. 作用范围: 定义Label的函数体内.
  3. Label可以声明在函数体的任何位置, 不管Label声明在调用点的前面还是后面.

一. goto

下面就以goto为例子展示上面三点特点.

1.Labelgoto是必须的

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一般用来跳出最近一层的switchfor, 注意不能用在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来使用的.但是在golangswitch/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
}
}

对于selectswitch也是一样.

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只能跳出最近一层的forswitch, 但是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.continuelabel一起使用(其实和不使用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的用法的更多相关文章

  1. golang中type常用用法

    golang中,type是非常重要的关键字,一般常见用法就是定义结构,接口等,但是type还有很多其它的用法,在学习中遇到了以下几种,这点简单总结记录下 定义结构 type Person struct ...

  2. golang 中strconv包用法

    链接:https://studygolang.com/articles/5003 http://www.cnblogs.com/golove/p/3262925.html

  3. Golang中的RegExp正则表达式用法指南

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  4. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  5. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  6. java中this的用法?

    2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ...

  7. JAVA语言中冒号的用法

    近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...

  8. golang 的 http cookie 用法

    golang的http cookie用法 在服务端程序开发的过程中,cookie经常被用于验证用户登录.golang 的 net/http 包中自带 http cookie的定义,下面就来讲一下coo ...

  9. Golang 中的坑 一

    Golang 中的坑 短变量声明  Short variable declarations 考虑如下代码: package main import ( "errors" " ...

随机推荐

  1. 漏洞扫描器-AWVS

    目录 介绍 漏洞扫描 网络爬虫==漏洞分析.验证 主机发现 子域名探测 SQL注入 HTTP头编辑 HTTP监听 介绍 AWVS为Acunetix Web Vulnarability Scanner的 ...

  2. 带你了解 Angular 与 Angular JS

    Angular 是一个基于 TypeScript 的开源客户端框架,专为构建 Web 应用程序而设计. 另一方面,AngularJS 是 Angular 的第一个版本,用纯 JavaScript 编写 ...

  3. docker容器使用loki收集日志

    docker-compose安装loki套件(loki+promtail+grafana) loki进行日志聚合处理  类似elk中的es promtail是日志收集,类似elk中的logstash ...

  4. Java动态脚本Groovy,高级啊!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚 ...

  5. Jenkins配置管理工具

    安装完成后,配置管理工具 安装并配置git yum -y install git 编辑git环境变量为/usr/bin/git 安装并配置maven wget https://mirrors.tuna ...

  6. ciscn_2019_s_6

    例行检查 没有开启nx保护,考虑用shellcode来做这道题 程序放入ida查看 我们可以输入48个字符覆盖0使printf打印出bp的值 继续看这里,buf的大小实际上只有0x38的大小,但是re ...

  7. [BUUCFT]PWN——pwn2_sctf_2016

    pwn2_sctf_2016[整数溢出+泄露libc] 题目附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,看看大概的执行情况 32位ida载入,shift+f12检索程序里的字符串, ...

  8. LuoguB2044 有一门课不及格的学生 题解

    Content 给出一名学生的语数英三门成绩,请判断该名学生是否恰好有一门不及格(成绩小于 \(60\) 分). 数据范围:成绩在 \(0\sim 100\) 之间. Solution 强烈建议先去做 ...

  9. CF1438A Specific Tastes of Andre 题解

    Content 如果一个序列的和能够被它的长度整除,我们称这个序列是不错的.如果一个序列的所有的非空子序列都是不错的,我们就称这个序列是完美的.现在有 \(t\) 组询问,每组询问给定一个整数 \(n ...

  10. 端云协同,打造更易用的AI计算平台

    内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<端云协同,HUAWEI HiAI Foundation打造更易用的AI计算平台>. 演讲嘉宾:华为海思AI技 ...