Trong Go, câu lệnh break có bị ngắt khỏi switch / select không?


143

Tôi biết rằng switch/ selecttuyên bố tự động phá vỡ sau mỗi trường hợp. Tôi tự hỏi, trong mã sau đây:

for {
    switch sometest() {
    case 0:
        dosomething()
    case 1:
        break
    default:
        dosomethingelse()
    }
}

breakcâu lệnh thoát khỏi forvòng lặp hoặc chỉ switchkhối?

Câu trả lời:


198

Phá vỡ các câu lệnh, Đặc tả ngôn ngữ lập trình Go.

Câu lệnh "break" chấm dứt thực thi câu lệnh "for", "switch" hoặc "select" trong cùng.

BreakStmt = "break" [ Label ] .

Nếu có nhãn, nhãn phải là câu lệnh "for", "switch" hoặc "select" kèm theo và đó là câu lệnh mà lệnh thực thi chấm dứt (câu lệnh §For, câu lệnh §Switch, câu lệnh §Select).

L:
  for i < n {
      switch i {
      case 5:
          break L
      }
  }

Do đó, breakcâu lệnh trong ví dụ của bạn chấm dứt switchcâu lệnh, câu lệnh "trong cùng".


4
Trường hợp sử dụng của breakbên trong select {}vì chỉ có một casecó thể được chọn?
Julio Guerra

3
Bởi vì ngay cả khi một trường hợp duy nhất được chọn, nó có thể có thời gian thực hiện dài hơn, sử dụng ngắt để chấm dứt thực thi vụ án, giống như bạn có thể quay lại từ bất kỳ đâu trong hàm.
Tit Petric

đó sẽ không phải là một desing xấu? bởi vì đi tới câu lệnh là một ý muốn xấu và các câu lệnh chuyển / chọn tự động ngắt
John Balvin Arias

55

Một ví dụ minh họa hy vọng:

loop:
for {
        switch expr {
        case foo:
                if condA {
                        doA()
                        break // like 'goto A'
                }

                if condB {
                        doB()
                        break loop // like 'goto B'                        
                }

                doC()
        case bar:
                // ...
        }
A:
        doX()
        // ...
}

B:
doY()
// ....

14

Vâng, breakphá vỡ nội tâm switch.

https://play.golang.org/p/SZdDuVjic4

package main

import "fmt"

func main() {

    myloop:for x := 0; x < 7; x++ {
        fmt.Printf("%d", x)
        switch {
        case x == 1:
            fmt.Println("start")
        case x == 5:
            fmt.Println("stop")
            break myloop
        case x > 2:
            fmt.Println("crunching..")
            break
        default:
            fmt.Println("idling..")
        }
    }
}
0idling..
1start
2idling..
3crunching..
4crunching..
5stop

Program exited.


2

điều này sẽ giải thích nó

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

Chạy mãi mãi

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

Một lần nữa, chạy mãi mãi

NHƯNG

package main

import "fmt"

func main() {
d:
for{
x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break d
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

sẽ in sjus ... rõ ràng?

http://play.golang.org/p/GOvnfI67ih


3
hmmm Tôi bao gồm một liên kết đi chơi, có thể hữu ích.
Jasmeet Singh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.