11. Go 语言流程控制:goto 无条件跳转

Hi,你们好,我是明哥。git

在本身学习 Golang 的这段时间里,我写了详细的学习笔记放在个人我的微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,所以写的东西应该会比较适合刚接触的同窗,若是你也是刚学习 Go 语言,不防关注一下,一块儿学习,一块儿成长。github

个人在线博客:http://golang.iswbm.com
个人 Github:github.com/iswbm/GolangCodingTimegolang


Go里的流程控制方法仍是挺丰富,整理了下有以下这么多种:编程

  • if - else 条件语句
  • switch - case 选择语句
  • for - range 循环语句
  • goto 无条件跳转语句
  • defer 延迟执行

前面三种,我已经都讲过了,今天要讲讲 goto 的无条件跳转。数组

很难想象在 Go 竟然会保留 goto,由于不少人不建议使用 goto,因此在一些编程语言中甚至直接取消了 goto。微信

我感受 Go 既然保留,必定有人家的理由,只是我目前还没感觉到。无论怎样,咱仍是照常学习吧。编程语言

0. 基本模型

goto 顾言思义,是跳转的意思。函数

goto 后接一个标签,这个标签的意义是告诉 Go程序下一步要执行哪里的代码。学习

因此这个标签如何放置,放置在哪里,是 goto 里最须要注意的。3d

goto 标签;
...
...
标签: 表达式;

1. 最简单的示例

goto 能够打破原有代码执行顺序,直接跳转到某一行执行代码。

import "fmt"

func main() {

	goto flag
	fmt.Println("B")
flag:
	fmt.Println("A")

}

执行结果,并不会输出 B ,而只会输出 A

A

2. 如何使用?

goto 语句一般与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

这边举一个例子,用 goto 的方式来实现一个打印 1到5 的循环。

import "fmt"

func main() {
	i := 1
flag:
	if i <= 5 {
		fmt.Println(i)
		i++
		goto flag
	}
}

输出以下

1
2
3
4
5

再举个例子,使用 goto 实现 类型 break 的效果。

import "fmt"

func main() {
	i := 1
	for {
		if i > 5 {
			goto flag
		}
		fmt.Println(i)
		i++
	}
flag:
}

输出以下

1
2
3
4
5

最后再举个例子,使用 goto 实现 类型 continue的效果,打印 1到10 的全部偶数。

import "fmt"

func main() {
	i := 1
flag:
	for i <= 10 {
		if i%2 == 1 {
			i++
			goto flag
		}
		fmt.Println(i)
		i++
	}
}

输出以下

2
4
6
8
10

3. 注意事项

goto语句与标签之间不能有变量声明,不然编译错误。

import "fmt"
 
func main() {
    fmt.Println("start")
    goto flag
    var say = "hello oldboy"
    fmt.Println(say)
flag:
    fmt.Println("end")
}

编译错误

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6

系列导读

01. 开发环境的搭建(Goland & VS Code)

02. 学习五种变量建立的方法

03. 详解数据类型:****整形与浮点型

04. 详解数据类型:byte、rune与string

05. 详解数据类型:数组与切片

06. 详解数据类型:字典与布尔类型

07. 详解数据类型:指针

08. 面向对象编程:结构体与继承

09. 一篇文章理解 Go 里的函数

10. Go语言流程控制:if-else 条件语句

11. Go语言流程控制:switch-case 选择语句

12. Go语言流程控制:for 循环语句

13. Go语言流程控制:goto 无条件跳转

14. Go语言流程控制:defer 延迟调用

15. 面向对象编程:接口与多态

16. 关键字:make 和 new 的区别?

17. 一篇文章理解 Go 里的语句块与做用域

18. 学习 Go 协程:goroutine

19. 学习 Go 协程:详解信道/通道

20. 几个信道死锁经典错误案例详解

21. 学习 Go 协程:WaitGroup

22. 学习 Go 协程:互斥锁和读写锁

23. Go 里的异常处理:panic 和 recover

24. 超详细解读 Go Modules 前世此生及入门使用

25. Go 语言中关于包导入必学的 8 个知识点

26. 如何开源本身写的模块给别人用?

27. 说说 Go 语言中的类型断言?

28. 这五点带你理解Go语言的select用法


相关文章
相关标签/搜索