2012-06-19 8 views

Odpowiedz

110

Break statements, The Go Programming Language Specification.

A "break" Oświadczenie kończy wykonanie najbardziej wewnętrznej "za", "przełącznik" lub "wybierz" oświadczenie.

BreakStmt = "break" [ Label ] . 

Jeśli istnieje etykieta, to musi być to zamykającego „za”, „przełącznik” lub „wybierz” oświadczenie, i to jest ten, którego realizacja zakończy (§For stwierdzeniach, §Switch wyciągi, § Wyrażenia wyciągowe).

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

Dlatego oświadczenie w swoim przykładzie break kończy oświadczenie switch, na "głębszą" oświadczenie.

+1

Jaki jest przypadek użycia 'break' wewnątrz' select {} ', ponieważ można wybrać tylko jeden" case "? –

+1

Ponieważ nawet jeśli wybrano pojedynczy przypadek, może on mieć dłuższą implementację, która używa przerwania, aby zakończyć wykonywanie sprawy, podobnie jak można powrócić z dowolnego miejsca w funkcji. –

6

Tylko od bloku przełącznika. Jest wiele przykładów z własnego kodu Golanga, które możesz zbadać (porównaj inner break z outer break).

+0

oba są uszkodzone linki –

+0

@lukewendling Stałe, dziękuję za zauważając tego. – raina77ow

30

miejmy nadzieję obrazowy przykład:

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

Wierzę w linię, która brzmi: break loop // jak 'goto B' – Jerred

2

powinno to wyjaśnić.

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

Działa zawsze

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

Ponownie, biegnie zawsze

ALE

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

wypisze sjus ... jasne?

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

+0

Twoja odpowiedź to tylko kopiowanie/wklejanie poprzednich odpowiedzi ... – Arkan

+3

hmmm Zawarłem link do odtwarzania, który może być pomocny. –

+0

Uwielbiam ostatni ekspres ... jasne? –

3

Tak, break przerwy wewnętrzna switch. Innym copy/paste do zabaw:

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

Innym zastosowaniem przerwą na przełączniku jest w połączeniu z fallthrough oświadczeniu. Może być potrzebna kreatywność, aby właściwie go użyć we właściwej sytuacji, ale jest to kombinacja, która może być użytecznie.

Oto prosty przykład:

a := 25 
fallThrough := true 

switch { 
case a > 10 : 
    fmt.Println("a>10") 
    if fallThrough != true { 
     break 
    } 
    fallthrough 
case a > 20: 
    fmt.Println("a>20") 
}