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

Mar*_*ark 4 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)
      }   
    }   
  }
Run Code Online (Sandbox Code Playgroud)

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

pet*_*rSO 10

Go编程语言规范

对于陈述

"for"语句指定重复执行块.迭代由条件,"for"子句或"range"子句控制.

ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
Condition = Expression .
Run Code Online (Sandbox Code Playgroud)

在最简单的形式中,只要布尔条件的计算结果为true,"for"语句就会指定块的重复执行.在每次迭代之前评估条件.如果条件不存在,则它等于布尔值true.

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

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

  • 在 Go 中,与其他语言一样,“函数 F 中的“返回”语句终止 F 的执行。” https://golang.org/ref/spec (3认同)
  • for 循环内部的 return 优先于函数的 return 吗?即,如果该函数正在寻找一个返回值,则该函数将需要另一个返回值? (2认同)
  • 我查看了 golang 规范(非常可读!)。我的理解是 return 是针对包含函数的 - 在这种情况下,它通过终止包含函数本身来打破循环。break 用于终止内部 for 循环,从而终止循环。也许这是显而易见的,但我太新了,我不能认为任何事情都是理所当然的。 (2认同)

Ain*_*r-G 9

for没有任何其他语句基本上与while (true)其他语言相同,无限循环.