2012-06-19 4 views
75

Я знаю, что switch/select заявления прерываются автоматически после каждого случая. Я задаюсь вопросом, в следующем коде:В Go, выполняет ли оператор break break от переключателя/select?

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

ли в break Оператор выхода из цикла for или просто switch блок?

ответ

110

Break statements, The Go Programming Language Specification.

A "перерыв" оператор завершает выполнение сокровенного "для", "переключателя" или "выберите" заявление.

BreakStmt = "break" [ Label ] . 

Если есть метка, она должна быть, объемлющим «для», «переключателя» или «выберите» заявление, и это то, чье исполнение прекращает (§For заявления, §Switch операторов, §Выберите утверждения).

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

Поэтому break утверждение в вашем примере завершает switch заявление, в "сокровенное" заявление.

+1

Каков предел 'break' внутри' select {} ', так как можно выбрать только один' case'? –

+1

Потому что, даже если выбран один случай, он может иметь более длинную реализацию, которая использует break для прекращения выполнения дела, так же, как вы можете вернуться из любой точки функции. –

0

Он только выходит из блока переключателей.

6

Просто от блока переключателей. В коде Golang есть много примеров, которые вы можете изучить (сравните inner break с outer break).

+0

оба неработающие ссылки –

+0

@lukewendling Fixed, спасибо за заметив, что. – 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

Я считаю, что строка, которая читает: break loop // like 'goto B' – 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

Другое использование перерыва переключатель в сочетании с проваливаемся заявление. Возможно, потребуется креативность, чтобы правильно использовать его в правильной ситуации, но, возможно, это удобная комбинация.

Вот простой пример:

a := 25 
fallThrough := true 

switch { 
case a > 10 : 
    fmt.Println("a>10") 
    if fallThrough != true { 
     break 
    } 
    fallthrough 
case a > 20: 
    fmt.Println("a>20") 
} 
Смежные вопросы