英文:
What does a golang for { ..block.. } without conditions do?
问题
我是一个golang新手,我遇到了一个非常有趣的控制结构,它不遵循经典的命令式for循环结构。我无法在文档中找到关于这个结构的信息。以下是相关的代码:
for {
// 读取每个传入的消息
m, err := getMessage(ws)
if err != nil {
log.Fatal(err)
}
// 检查是否提到了我们
if m.Type == "message" && strings.HasPrefix(m.Text, "<@"+id+">") {
// 如果是,尝试解析它
ans := lookup(session, m.Text)
if len(ans)>0 {
// 看起来不错,获取引用并回复结果
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)
// 注意:Message对象被复制,这是有意的
} else {
// 嗯?
m.Text = fmt.Sprintf("抱歉,无法计算\n")
postMessage(ws, m)
}
}
}
这个循环结构会一直循环下去,除非有外部事件触发退出。
英文:
I'm a golang neophyte and I've come across a rather interesting control structure which doesn't follow the classical imperative for-loop construct. I've been unable to locate on documentation on the structure either. The following is the code in question:
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)
}
}
}
Does the loop construct just loop forever or is there an eventing system binding behind the scenes?
答案1
得分: 24
《Go编程语言规范》
对于语句
一个“for”语句指定了一个块的重复执行。迭代由条件、“for”子句或“range”子句控制。
ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
Condition = Expression .
在其最简单的形式中,一个“for”语句指定了一个块的重复执行,只要布尔条件求值为true。条件在每次迭代之前进行求值。如果条件不存在,则等同于布尔值true。
如果条件不存在,例如for { ... }
,它等同于布尔值true
,例如for true { ... }
。有时它被称为无限循环。因此,您将需要另一种机制,如break
或return
,来终止循环。
关于“for”语句的文档可以在《Go编程语言规范》中找到。
英文:
> The Go Programming Language Specification
>
> For statements
>
> A "for" statement specifies repeated execution of a block. The
> iteration is controlled by a condition, a "for" clause, or a "range"
> clause.
>
> ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
> Condition = Expression .
>
> In its simplest form, a "for" statement specifies the repeated
> execution of a block as long as a boolean condition evaluates to true.
> The condition is evaluated before each iteration. If the condition is
> absent, it is equivalent to the boolean value true.
If the condition is absent, for example, for { ... }
, it is equivalent to the boolean value true
, for example for true { ... }
. It is sometimes referred to as an infinite loop. Therefore, you will need another mechanism, such as break
or return
, to terminate the loop.
The documentation for the for
statement is the The Go Programming Language Specification.
答案2
得分: 12
for
在其他语言中,如果没有其他附加语句,基本上与while (true)
是一样的,都是一个无限循环。
英文:
for
without any additional statements is basically the same as while (true)
in other languages, an infinite loop.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论