Git'te bir break ifadesi bir switch / select'ten kopar mı?


144

Biliyorum switch/ selectifadeler her durumdan sonra otomatik olarak bozulur. Aşağıdaki kodda merak ediyorum:

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

Does breakdeyimi çıkmak fordöngü ya da sadece switchblok?

Yanıtlar:


199

Break deyimleri, Go Programlama Dili Özelliği.

"Break" ifadesi, "," switch "veya" select "ifadesi için en içteki" yürütmeyi sonlandırır. "

BreakStmt = "break" [ Label ] .

Bir etiket varsa, "", "anahtar" veya "select" ifadesi için kapalı bir etiket olmalıdır ve yürütmesi sona eren ifadedir (§Bildirimler, §Switch ifadeleri, §Seçme ifadeleri).

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

Bu nedenle, breakörneğinizdeki switchifade, "en içteki" ifade olan ifadeyi sonlandırır .


4
Kullanımı vaka nedir breakdahilinde select {}tek beri caseseçilebilir?
Julio Guerra

3
Tek bir vaka seçilse bile, bir işlevin herhangi bir yerinden dönebileceğiniz gibi, davanın yürütülmesini sonlandırmak için break kullanan daha uzun bir uygulamaya sahip olabilir.
Tit Petric

kötü bir tasarım olmaz mıydı? çünkü ifadeye gitmek kötü bir tasarımdır ve ifadeleri otomatik olarak kırmak / seçmek / kırmak
John Balvin Arias

55

Umarım açıklayıcı bir örnek:

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

Evet, breakiç kısmı kırıyor 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

bu açıklamalı.

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

Sonsuza kadar çalışır

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

Yine, sonsuza kadar koşar

FAKAT

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

sjus yazdıracak ... temiz mi?

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


3
hmmm Yardımcı olabilecek bir go play bağlantısı ekledim.
Jasmeet Singh

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.