2016-01-21 3 views
0

Я - неофит голангов, и я столкнулся с довольно интересной структурой управления, которая не соответствует классической конструкции императива для цикла. Мне также не удалось найти документацию по структуре. Ниже приведен код в вопросе:Что делает golang для {..block ..} без условий?

for { 
    // read each incoming message 
    m, err := getMessage(ws) 
    if err != nil { 
     log.Fatal(err) 
    } 

    // see if we're mentioned 
    if m.Type == "message" && strings.HasPrefix(m.Text, "<@"+id+">") { 
     // if so try to parse if 
     ans := lookup(session, m.Text) 
     if len(ans)>0 { 
     // looks good, get the quote and reply with the result 
     go func(m Message) { 
      for _, def := range ans { 
      if len(def[1]) > 0 { 
       m.Text = "*" + def[0] + " " + def[1] + "*: " + def[2] 
      } else { 
       m.Text = "*" + def[0] + "*: " + def[2] 
      } 
      postMessage(ws, m) 
      } 
     }(m) 
     // NOTE: the Message object is copied, this is intentional 
     } else { 
     // huh? 
     m.Text = fmt.Sprintf("sorry, that does not compute\n") 
     postMessage(ws, m) 
     } 
    } 
    } 

построить ли цикл только цикл навсегда или есть система троеборье связывания за кулисами?

+4

* Содержит ли цикл только цикл навсегда * Да. –

+4

В [Tour of Go] (http://tour.golang.org/flowcontrol/3) и в [Effective Go] (https://golang.org/doc/effective_go.html#for) – JimB

ответ

7

The Go Programming Language Specification

For statements

А "за" заявление определяет повторное выполнение блока. Итерация контролируется условием, предложением «для» или «диапазоном» .

ForStmt = "for" [ Condition | ForClause | RangeClause ] Block . 
Condition = Expression . 

В своей простейшей форме «для» заявление определяет повторное выполнения блока до тех пор, как логическое условие принимает значение истины. Условие оценивается перед каждой итерацией. Если условие отсутствует, оно эквивалентно логическому значению true.

Если условие отсутствует, например, for { ... }, это эквивалентно логическому значению true, например for true { ... }. Его иногда называют бесконечным циклом. Поэтому вам понадобится другой механизм, такой как break или return, чтобы завершить цикл.

Документация для заявления for - это The Go Programming Language Specification.

+0

действительно возвращается внутрь из цикла for имеют приоритет над возвратом функции? т. е. функция будет нуждаться в другом возврате, если она ищет его? – user391339

+0

Я посмотрел на golang spec (удивительно читаемый!). мое понимание заключается в том, что return является для содержащей функции - в этом случае он прерывает цикл, завершая содержащую функцию. break - для завершения внутреннего цикла цикла, который завершает цикл. возможно, это было очевидно, но я так новичок, я не могу считать что-то само собой разумеющимся. – user391339

+1

В Go, как и на других языках, оператор «A» return в функции F завершает выполнение F. » https://golang.org/ref/spec – peterSO

7

for без каких-либо дополнительных инструкций в основном то же, что и while (true) на других языках, бесконечный цикл.