break
可以离开目前switch
、for
以及select
(之后介绍);continue
只用于for
循环,略过之后语句,并回到循环开头进行下一次循环,而不是离开循环。goto
可以在函数中,让流程直接跳至指定标签;实际上,break
、continue
在循环中,也可以搭配标签来使用。
break
在〈if … else、switch 条件式〉中说明过,switch
的case
中不必特别使用break
,因为switch
中默认不会fallthrough
,但case
中若必要,还是可以使用break
,中断break
之后与下个case
前的流程。
break
使用于for
循环时,会结束循环,例如:
package main
import "fmt"
func main() {
for i := 1; i < 10; i++ {
if i == 5 {
break
}
fmt.Printf("i = %d\n", i)
}
}
这段程序会显示 i = 1 到 i = 4,因为在 i 等于 5 时就会执行break
而离开for
循环。
break
可以配合标签使用,例如本来break
只会离开一层for
循环,若设定标签,并于break
时指定标签,就可以直接离开多层for
循环:
package main
import "fmt"
func main() {
BACK:
for j := 1; j < 10; j++ {
for i := 1; i < 10; i++ {
if i == 5 {
break BACK
}
fmt.Printf("i = %d, j = %d\n", i, j)
}
fmt.Println("test")
}
}
你可以执行看看上面的范例,之后将BACK:
与BACK
拿掉看看,前者break BACK
时会离开两层for
循环,后者只会离开内层for
循环。
continue
continue
只用于for
循环,略过之后语句,并回到循环开头进行下一次循环,例如将先前第一个范例程序的break
改成continue
:
package main
import "fmt"
func main() {
for i := 1; i < 10; i++ {
if i == 5 {
continue
}
fmt.Printf("i = %d\n", i)
}
}
这段程序会显示 i = 1 到 4,以及 6 到 9,当i
等于 5 时,会执行continue
直接略过之后语句,也就是该次的fmt.Printf()
该行并没有被执行,直接从for
开头执行下一次循环,所以 i = 5 没有被显示。
continue
也有搭配标签的用法:
package main
import "fmt"
func main() {
BACK:
for j := 1; j < 10; j++ {
for i := 1; i < 10; i++ {
if i == 5 {
continue BACK
}
fmt.Printf("i = %d, j = %d\n", i, j)
}
fmt.Println("test")
}
}
goto
在 C/C++ 中,goto
是一个很方便,但是常不建议使用的语法,因为滥用它的话,经常会破坏程序的架构、使得程序的逻辑混乱,然而,在 Go 中,亦有提供有goto
语法。
相对于break
与continue
跳跃时,只能前往for
循环开头处设定的标签,goto
可以在函数中,从某区块内跳跃至区块外任何位置,一个简单的例子如下:
package main
import "fmt"
func main() {
var input int
RETRY:
fmt.Printf("输入数字")
fmt.Scanf("%d", &input)
if input == 0 {
fmt.Println("除数不得为 0")
goto RETRY
}
fmt.Printf("100 / %d = %f\n", input, 100/float32(input))
}
如果你输入 0,程序会显示错误消息后跳至RETRY:
,再执行一次提示与输入。
注意,goto
可以在函数中,从某区块内跳跃至区块外任何位置,但不能从某区块跳入另一区块内,例如,以下是错误的,会发生 goto TEST jumps into block 的错误:
package main
import "fmt"
func main() {
var input int
RETRY:
fmt.Printf("输入数字")
fmt.Scanf("%d", &input)
if input == 0 {
TEST:
fmt.Println("除数不得为 0")
goto RETRY
}
fmt.Printf("100 / %d = %f\n", input, 100/float32(input))
goto TEST
}