break、continue、goto


break可以离开目前switchfor以及select(之后介绍);continue只用于for循环,略过之后语句,并回到循环开头进行下一次循环,而不是离开循环。goto可以在函数中,让流程直接跳至指定标签;实际上,breakcontinue在循环中,也可以搭配标签来使用。

break

在〈if … else、switch 条件式〉中说明过,switchcase中不必特别使用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语法。

相对于breakcontinue跳跃时,只能前往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
}




展开阅读全文