Dalam Go, apakah pernyataan break istirahat dari switch / pilih?


144

Saya tahu bahwa switch/ selectpernyataan rusak secara otomatis setelah setiap kasus. Saya bertanya-tanya, dalam kode berikut:

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

Apakah breakpernyataan keluar dari forloop atau hanya switchblok?

Jawaban:


199

Istirahat pernyataan, Spesifikasi Bahasa Pemrograman Go.

Pernyataan "break" mengakhiri eksekusi pernyataan "untuk", "switch" atau "pilih" yang paling dalam.

BreakStmt = "break" [ Label ] .

Jika ada label, itu harus berupa pernyataan "for", "switch", atau "select" yang terlampir, dan itu adalah orang yang eksekusinya berakhir (§Untuk pernyataan, § Pernyataan dapur, §Pilih pernyataan).

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

Oleh karena itu, breakpernyataan dalam contoh Anda mengakhiri switchpernyataan, pernyataan "paling dalam".


4
Apa gunanya bagian breakdalam select {}karena hanya satu yang casebisa dipilih?
— Julio Guerra

3
Karena bahkan jika satu case dipilih, itu mungkin memiliki implementasi yang lebih lama yang menggunakan istirahat untuk mengakhiri eksekusi case, seperti Anda dapat kembali dari mana saja dalam suatu fungsi.
— Tit Petric

bukankah itu desing yang buruk? karena pergi ke pernyataan adalah desing yang buruk, dan beralih / pilih pernyataan rusak secara otomatis
— John Balvin Arias

55

Contoh ilustrasi mudah-mudahan:

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

Ya, breakhancurkan batin 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

ini harus menjelaskannya.

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

Berjalan selamanya

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

Sekali lagi, berjalan selamanya

TAPI

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")
    }
}
}

akan mencetak sjus ... jelas?

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


3
hmmm saya menyertakan tautan go play, yang mungkin bisa membantu.
— Jasmeet Singh

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.