2012-06-19 20 views
75

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

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

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

उत्तर

110

Break statements, The Go Programming Language Specification.

ए 'को तोड़ने "बयान, " स्विच "या" के लिए "अंतरतम के निष्पादन समाप्त हो जाता है बयान" का चयन करें "।

BreakStmt = "break" [ Label ] . 

अगर वहाँ एक लेबल है, यह होना चाहिए, "स्विच" या "के लिए" एक संलग्न की है कि "का चयन करें" बयान है, और है कि एक जिसका निष्पादन समाप्त हो जाता है (बयान, §Switch §For है बयान, § बयानों का चयन करें)।

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

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

+1

'चयन {}' के भीतर 'ब्रेक' का उपयोग केस क्या है क्योंकि केवल एक 'केस' चुना जा सकता है? –

+1

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

0

यह केवल स्विच ब्लॉक से बाहर निकलता है।

6

बस एक स्विच ब्लॉक से। गोलांग के अपने कोड में बहुत सारे उदाहरण हैं जिनकी आप जांच कर सकते हैं (inner break की तुलना outer break के साथ करें)।

+0

दोनों लिंक –

+0

टूट रहे हैं @lukewendling फिक्स्ड, कि देख के लिए धन्यवाद। – raina77ow

30

एक उम्मीद है कि उदाहराणदर्शक उदाहरण:

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() 
// .... 
+0

मुझे लगता है कि जो लाइन पढ़ती है: ब्रेक लूप // जैसे 'गोटो बी' – Jerred

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

+0

आपका उत्तर सिर्फ पिछले उत्तरों की एक प्रतिलिपि/पेस्ट है ... – Arkan

+3

hmmm मैंने एक गो प्ले लिंक शामिल किया है, जो सहायक हो सकता है। –

+0

मुझे अंतिम एक्सप्रेस पसंद है ... स्पष्ट? –

3

हाँ, 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. 
0

स्विच के लिए तोड़ने के एक अन्य प्रयोग fallthrough बयान के साथ संयोजन में है। इसे सही स्थिति में सही ढंग से उपयोग करने के लिए कुछ रचनात्मकता की आवश्यकता हो सकती है, लेकिन यह संभवतः एक प्रयोग योग्य संयोजन है।

यहाँ सरल उदाहरण है:

a := 25 
fallThrough := true 

switch { 
case a > 10 : 
    fmt.Println("a>10") 
    if fallThrough != true { 
     break 
    } 
    fallthrough 
case a > 20: 
    fmt.Println("a>20") 
} 
संबंधित मुद्दे