没有条件的{..block ..}的golang是做什么的?

时间:2016-01-21 17:00:03

标签: go

我是一个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)
      }   
    }   
  }

循环构造是永远循环还是在幕后有事件系统绑定?

2 个答案:

答案 0 :(得分:9)

  

The Go Programming Language Specification

     

For statements

     

“for”语句指定重复执行块。该   迭代由条件,“for”子句或“范围”控制   子句。

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

在最简单的形式中,“for”语句指定重复   只要布尔条件的计算结果为true,就执行一个块。   在每次迭代之前评估条件。如果条件是   缺席时,它相当于布尔值true。

如果条件不存在,例如for { ... },则它等同于布尔值true,例如for true { ... }。它有时被称为无限循环。因此,您需要其他机制(例如breakreturn)来终止循环。

for语句的文档是The Go Programming Language Specification

答案 1 :(得分:8)

没有任何其他语句的

for与其他语言中的while (true)基本相同,无限循环。