GO语言学习笔记(九):GO语言流程控制之延迟语句与标签

分类:
GO
标签:
基础
学习笔记
作者:
何鑫
创作时间:
2019/07/28 22:45:17

摘要:defer,break,continue与goto

延迟语句

在GO语言中有一种特殊的语句叫延迟语句,用defer定义:

package main

import "fmt"

func main() {
   defer fmt.Println("我执行了!")
   fmt.Println("你好,世界!")
}

运行输出:

你好,世界!

我执行了!

可以看到虽然我先写了“我执行了”,却在最后进行了输出,这就是defer的作用,它会在函数return前执行操作,利用它延迟执行的特性我们可以做一些如资源清理之类的操作。

如果有多个defer语句,又会如何执行呢?

package main

import "fmt"

func main() {
   defer fmt.Println("我执行了!-1")
   defer fmt.Println("我执行了!-2")
   defer fmt.Println("我执行了!-3")
   fmt.Println("你好,世界!")
}

运行输出:

你好,世界!

我执行了!-3

我执行了!-2

我执行了!-1

可以看到,最先定义的defer语句反而最后输出,可见defer语句类似一个栈结构,先进后出,这点需要特别注意!

标签

标签一般不独立存在,在定义标签后,我们一般结合break,continue,goto等关键字来使用。

标签定义:

标签名:

        代码块

L1:
   fmt.Println("我被打上了标签")

break  用于跳出当前控制流程(for,select)

package main

import "fmt"

func main() {
   for i := 0; i < 10; i++ {
      fmt.Println(i)
      if i == 5 {
         break
      }
   }
}

输出:

0

1

2

3

4

5

当i等于5时,跳出了当前循环语句。

还可以结合标签使用:

package main

import "fmt"

func main() {
   for {
      for i := 0; i < 10; i++ {
         fmt.Println(i)
         if i == 5 {
            break
         }
      }
   }
}

上面的代码虽然有break,但是break只会跳出当前循环,所以依然是个死循环,我们可以在里层for外再加一个break,也可以使用标签:

package main

import "fmt"

func main() {
   L1:
      for {
         for i := 0; i < 10; i++ {
            fmt.Println(i)
            if i == 5 {
               break L1
            }
         }
      }
}

这也可以跳出死循环。

continue 只能用于for,它表示继续执行:

package main

import "fmt"

func main() {
   for i := 0; i < 5; i++ {
      fmt.Println(i)
      continue
      fmt.Println("我不会被执行")
   }
}

 输出:

0

1

2

3

4

循环语句中continue之后的代码不会被执行,因为continue的表示继续下一次循环。

continue也可以结合标签使用,我们把上面break结合标签使用中的代码改动一下,把break换成continue:

package main

import "fmt"

func main() {
L1:
   for {
      for i := 0; i < 10; i++ {
         fmt.Println(i)
         if i == 5 {
            continue L1
         }
      }
   }
}

运行后发现,这是个死循环,因为在这里continue表示继续执行标签中代码。

goto 结合标签使用,可以无条件跳转到标签位置,如:

package main

import "fmt"

func main() {
   for {
      for i := 0; i < 10; i++ {
         fmt.Println(i)
         if i == 5 {
            goto L1
         }
      }
   }
   fmt.Println("我不会执行")
   L1:
      fmt.Println("我是goto跳来的")
}

输出:

0

1

2

3

4

5

我是goto跳来的

需要注意一点,只能在同一函数中跳转。

发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论