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?

Mat
sumber

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".

peterSO
sumber
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()
// ....
zzzz
sumber
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.
techtonik anatoly
sumber
8

Hanya dari blok saklar. Ada banyak contoh dalam kode Golang sendiri yang dapat Anda periksa (bandingkan istirahat dalam dengan istirahat luar ).

Raina77ow
sumber
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

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

Itu hanya keluar dari blok saklar.

Sebastian
sumber