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
}

