Skip to content

break ​

在 Go 语言中,break 语句立即终止一个 for 循环、switch 或 select 语句的执行。

基本用法 ​

for 循环中的 break ​

在 for 循环中,break 用于跳出循环体,无论循环条件是否还满足。

示例:

go
package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break
        }
        fmt.Println(i)
    }
}

输出:

0
1
2
3
4

在这个示例中,当 i 的值达到 5 时,break 语句会终止 for 循环,导致循环在输出到 4 后停止。

switch 语句中的 break ​

在 switch 语句中,break 通常不需要,因为每个 case 块在执行完毕后会自动跳出 switch 语句。然而,如果在 switch 中嵌套了 for 或其他 switch,break 可以用于跳出这些结构。

示例:

go
package main

import "fmt"

func main() {
    switch day := 2; day {
    case 1:
        fmt.Println("Monday")
    case 2:
        fmt.Println("Tuesday")
        // 假设有其他结构在这里
        break // 这个 break 是多余的
    case 3:
        fmt.Println("Wednesday")
    }
}

在这个示例中,break 语句实际上是多余的,因为每个 case 自动跳出 switch 语句。

select 语句中的 break ​

在 select 语句中,break 用于跳出 select 语句的执行。需要注意:当 select 位于 for 循环内部时,不带标签的 break 只会跳出 select 本身,而不会跳出外层的 for 循环。如果要退出循环,必须使用带标签的 break。

示例:不带标签的 break 只跳出 select

go
package main

import "fmt"

func main() {
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    close(ch)

    for {
        select {
        case msg, ok := <-ch:
            if !ok {
                fmt.Println("channel closed")
                break // 只跳出 select,for 循环还会继续下一轮
            }
            fmt.Println("Received:", msg)
        }
        if len(ch) == 0 {
            // select 中已经取不到数据,通过其他条件结束循环
            fmt.Println("done")
            return
        }
    }
}

示例:使用标签跳出 for 循环

go
package main

import "fmt"

func main() {
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    close(ch)

loop:
    for {
        select {
        case msg, ok := <-ch:
            if !ok {
                fmt.Println("channel closed")
                break loop // 跳出外层的 for 循环
            }
            fmt.Println("Received:", msg)
        }
    }
}

在这个示例中,break loop 语句会终止 for 循环;如果写成不带标签的 break,则只结束当前这一次 select,循环会无限执行下去。

注意事项 ​

  1. break 和 标签:break 可以与标签一起使用,以跳出多层嵌套的循环。标签用于标识外部循环,break 可以指定标签来跳出特定的循环。

示例:

go
package main

import "fmt"

func main() {
OuterLoop:
    for i := 0; i < 5; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 && j == 2 {
                break OuterLoop
            }
            fmt.Println(i, j)
        }
    }
}

在这个示例中,break OuterLoop 语句会跳出标记为 OuterLoop 的外层 for 循环。

  1. break 只能用于循环和 switch 语句:break 语句不能用在函数或其他代码块中,只能用于跳出循环结构和 switch 语句。

  2. break 不影响其他控制流:break 只终止当前的循环或 switch 语句,不会影响其他控制流结构的执行。

总结 ​

  • for 循环:break 用于提前终止循环体的执行。
  • switch 语句:break 通常不需要,因为 case 自动跳出 switch,但可以用于更复杂的控制流。
  • select 语句:break 用来退出当前的 select;要退出其所在的 for 循环,必须使用带标签的 break。
  • 标签:break 与标签一起使用,可以跳出多层嵌套的循环。

最常见的坑是 select 写在循环里:不带标签的 break 只跳出 select,for 还在转。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang