2016-01-21 69 views
0

我是一個golang初學者,我遇到了一個非常有趣的控制結構,它不遵循經典命令for-loop結構。我一直無法找到有關結構的文檔。以下是有問題的代碼:沒有條件的{..block ..}的golang會有什麼作用?

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

A 「爲」 語句指定重複的塊的執行。迭代由條件,「for」子句或「範圍」子句控制。

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

在其最簡單的形式中,「爲」語句只要一個布爾條件評估爲真指定重複 執行的塊的。 在每次迭代之前評估條件。如果條件爲 不存在,則它等同於布爾值true。

如果條件不存在,例如,for { ... },它等同於布爾值true,例如for true { ... }。它有時被稱爲無限循環。因此,您將需要其他機制(例如breakreturn)來終止循環。

for聲明的文檔是The Go Programming Language Specification

+0

確實返回裏面for循環優先於函數的返回?即如果該函數正在尋找一個函數,它將需要另一個返回? – user391339

+0

我看了一下golang規範(非常可讀!)。我的理解是return是包含函數 - 在這種情況下,它通過終止包含函數本身來打破循環。 break是終止循環的內部循環,終止循環。也許這是顯而易見的,但我是如此新,我不能把任何理所當然。 – user391339

+1

在Go中,與其他語言一樣,函數F中的「A」返回「語句終止F的執行」。 https://golang.org/ref/spec – peterSO

7

for沒有任何附加語句基本上與while (true)在其他語言中一樣,無限循環。

相關問題