गो में, क्या स्विच / चयन से ब्रेक स्टेटमेंट टूट जाता है?


144

मुझे पता है कि switch/ selectबयान हर मामले के बाद स्वतः ही टूट जाते हैं। मैं निम्नलिखित कोड में सोच रहा हूँ:

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

क्या breakकथन forलूप से बाहर निकलता है या सिर्फ switchब्लॉक होता है?

जवाबों:


199

ब्रेक स्टेटमेंट्स, द गो प्रोग्रामिंग लैंग्वेज स्पेसिफिकेशन।

एक "ब्रेक" स्टेटमेंट "," स्विच "या" सिलेक्ट "स्टेटमेंट के लिए इनमोस्टर" के निष्पादन को समाप्त करता है।

BreakStmt = "break" [ Label ] .

यदि कोई लेबल है, तो यह "के लिए", "स्विच" या "चयन" कथन के साथ संलग्न होना चाहिए, और वह वह है जिसका निष्पादन समाप्त हो गया है (statementsFor कथन, itchSwitch कथन, lectSelect कथन)।

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

इसलिए, breakआपके उदाहरण में switchदिए गए बयान, "अंतरतम" कथन को समाप्त करता है ।


4
केवल एक का चयन करने breakके select {}बाद से भीतर का उपयोग मामला क्या है case?
जूलियो गुएरा

3
क्योंकि यदि किसी एकल मामले का चयन किया जाता है, तो भी इसका एक लंबा कार्यान्वयन हो सकता है जो मामले के निष्पादन को समाप्त करने के लिए विराम का उपयोग करता है, बहुत कुछ जैसे आप एक फ़ंक्शन में कहीं से भी लौट सकते हैं।
टाइट पेट्रिक

यह एक बुरा desing नहीं होगा? क्योंकि बयान पर जाना एक बुरी इच्छा है, और स्वचालित रूप से स्विच / चुनिंदा बयानों को तोड़ दिया जाता है
जॉन बल्विन एरियस

55

एक उम्मीद के मुताबिक उदाहरण:

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

हां, breakभीतर को तोड़ता है 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

इसे समझाना चाहिए।

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

हमेशा के लिए भागता है

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

फिर, हमेशा के लिए चलता है

परंतु

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 प्रिंट करेंगे ... स्पष्ट?

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


3
हममम में एक गो प्ले लिंक शामिल था, जो सहायक हो सकता है।
जसमीत सिंह

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.