Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。
**系列导读**
[从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygolang.com/articles/27365)
[从零学习 Go 语言(02):学习五种变量创建的方法](https://studygolang.com/articles/27432)
[从零学习 Go 语言(03):数据类型之整型与浮点型](https://studygolang.com/articles/27440)
[从零学习 Go 语言(04):byte、rune与字符串](https://studygolang.com/articles/27463)
[从零学习 Go 语言(05):数据类型之数组与切片](https://studygolang.com/articles/27508)
[从零学习 Go 语言(06):数据类型之字典与布尔类型](https://studygolang.com/articles/27563)
[从零学习 Go 语言(07):数据类型之指针](https://studygolang.com/articles/27585)
[从零学习 Go 语言(08):流程控制之if-else](https://studygolang.com/articles/27613)
[从零学习 Go 语言(09):流程控制之switch-case](https://studygolang.com/articles/27660)
[从零学习 Go 语言(10):流程控制之for 循环](https://studygolang.com/articles/28120)
---
Go里的流程控制方法还是挺丰富,整理了下有如下这么多种:
- if - else 条件语句
- switch - case 选择语句
- for - range 循环语句
- goto 无条件跳转语句
- defer 延迟执行
前面三种,我已经都讲过了,今天要讲讲 goto 的无条件跳转。
很难想象在 Go 居然会保留 goto,因为很多人不建议使用 goto,所以在一些编程语言中甚至直接取消了 goto。
我感觉 Go 既然保留,一定有人家的理由,只是我目前还没感受到。不管怎样,咱还是照常学习吧。
## 0. 基本模型
`goto` 顾言思义,是跳转的意思。
goto 后接一个标签,这个标签的意义是告诉 Go程序下一步要执行哪里的代码。
所以这个标签如何放置,放置在哪里,是 goto 里最需要注意的。
```go
goto 标签;
...
...
标签: 表达式;
```
## 1. 最简单的示例
`goto` 可以打破原有代码执行顺序,直接跳转到某一行执行代码。
```go
import "fmt"
func main() {
goto flag
fmt.Println("B")
flag:
fmt.Println("A")
}
```
执行结果,并不会输出 B ,而只会输出 A
```
A
```
## 2. 如何使用?
`goto` 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
这边举一个例子,用 `goto` 的方式来实现一个打印 1到5 的循环。
```go
import "fmt"
func main() {
i := 1
flag:
if i <= 5 {
fmt.Println(i)
i++
goto flag
}
}
```
输出如下
```
1
2
3
4
5
```
再举个例子,使用 goto 实现 类型 break 的效果。
```go
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 的所有偶数。
```go
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语句与标签之间不能有变量声明,否则编译错误。
```go
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
```
---
![](http://image.python-online.cn/20200321153457.png)
有疑问加站长微信联系(非本文作者))