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.