Вопрос по go, switch-statement, break, select – В Go ли оператор break разрывается от switch / select?

102

я знаю этоswitch/select заявления нарушаются автоматически после каждого случая. Мне интересно, в следующем коде:

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

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

Ваш Ответ

6   ответов
1

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

напечатает сьюс ... Чисто ?

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

я люблю последний экспресс ... ясно?
Ваш ответ - просто копия / вставка предыдущих ответов ...
хммм, я включил ссылку go play, которая может оказаться полезной.
6

множество примеров (сравнитьвнутренний перерыв свнешний разрыв).

оба неработающие ссылки
@lukewendling Исправлено, спасибо, что заметили это.
37

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()
// ....
Я считаю, что строка, которая гласит: разрыв цикла // как & Go; B & Apos;
0

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

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

a := 25
fallThrough := true

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

Break statements, The Go Programming Language Specification.

A "break" statement terminates execution of the innermost "for", "switch" or "select" statement.

BreakStmt = "break" [ Label ] .

If there is a label, it must be that of an enclosing "for", "switch" or "select" statement, and that is the one whose execution terminates (§For statements, §Switch statements, §Select statements).

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

Следовательноbreak утверждение в вашем примере завершаетswitch утверждение, "самый внутренний" заявление.

Каков вариант использованияbreak вselect {} так как только одинcase можно выбрать?
Потому что даже если выбран один случай, он может иметь более длинную реализацию, которая использует разрыв для завершения выполнения случая, так же, как вы можете вернуться из любой точки функции.
Разве это не плохой дизайн? потому что переход к оператору - это плохой дизайн, а операторы переключения / выбора ломаются автоматически
8

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.

Похожие вопросы