ITPub博客

首页 > > > 从零学习 Go 语言(11):goto 无条件跳转

从零学习 Go 语言(11):goto 无条件跳转

作者:dapan 时间:2020-07-08 13:45:39 0 删除 编辑
文章首发自公众号:Go编程时光

《Go编程时光》,一个能带你学习 Go 语言的专栏,同时欢迎搜索我的同名公众号,第一时间获取Go语言干货。

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

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

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

很难想象在 Go 居然会保留 goto,因为很多人不建议使用 goto,所以在一些编程语言中甚至直接取消了 goto。

我感觉 Go 既然保留,一定有人家的理由,只是我目前还没感受到。不管怎样,咱还是照常学习吧。


0. 基本模型

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

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

所以这个标签如何放置,放置在哪里,是 goto 里最需要注意的。

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/758/viewspace-3158794/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87037