break 与 continue 语句

Go 语言支持在循环语句中通过 break 语句跳出循环,通过 continue 语句进入下一个循环。
break 的默认作用范围是该语句所在的最内部的循环体:

  1. package main
  2. import "fmt"
  3. func main() {
  4. arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
  5. for i := 0; i < len(arr); i++ {
  6. for j := 0; j < len(arr[i]); j++ {
  7. num := arr[i][j]
  8. if j > 1 {
  9. break
  10. }
  11. fmt.Println(num)
  12. }
  13. }
  14. }

continue 则用于忽略剩余的循环体而直接进入下一次循环的过程:

package main

import "fmt"

func main() {
    arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
    for i := 0; i < len(arr); i++ {
        for j := 0; j < len(arr[i]); j++ {
            num := arr[i][j]
            if j > 1 {
                break
            } else {
                continue
            }
            fmt.Println(num)
        }
    }
}

如果我们这样改写程序的话,上述代码不会打印任何值,因为 continue 语句会忽略后续代码直接进入下一个循环。

标签

Go 语言的 break 和 contine 与 PHP 的不同之处在于支持与标签结合跳转到指定的标签语句,从而改变这两个语句的默认跳转逻辑,标签语句通过标签+「:」进行声明:

package main

import "fmt"

func main() {
    arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
BREAK1:
    for i := 0; i < len(arr); i++ {
        for j := 0; j <= len(arr[i]); j++ {
            if j > 1 {
                break BREAK1
            }
            fmt.Println(arr[i][j])
        }
    }
}

goto 语句

goto 语句被多数语言学者所反对,告诫大家不要使用,因为很容易造成代码逻辑混乱,容易导致不易发现的 bug。但 Go 语言仍然支持 goto 关键字,goto 语句的语义非常简单,就是跳转到本函数内的某个标签,如:

package main

import "fmt"

func main() {
    arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
    for i := 0; i < len(arr); i++ {
        for j := 0; j <= len(arr[i]); j++ {
            if j > 1 {
                goto EXIT1
            }
            fmt.Println(arr[i][j])
        }
    }
EXIT1:
    fmt.Println("goto exit")
}