清水泥沙

golang基础(22.跳转语句)

break 与 continue 语句

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

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
			}
			fmt.Println(num)
		}
	}
}

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")
}