在Go中,您可以执行以下操作:
if foo := bar() ; foo != nil {
...
}在C/C++中,您可以执行以下操作:
while ((foo = bar()) != NULL) {
...
}然而,Go的语法似乎没有提供任何在while循环中进行赋值和比较的等效方法;Go已经用特定的for调用替换了while (例如,for a等同于for ; a ;)。简单地尝试使用if版本语法会使解析器感到困惑,因为它期望有第三个语句。
我可以说:
for foo := bar() ; foo != nil ; foo = bar() {
....
}但是在本例中,bar()调用相当长、很复杂,而且不容易分解成它自己的函数(虽然我可以做一些事情,比如声明一个本地func来调用,但这仍然会降低代码的清晰度)。
现在我要做的是:
for {
foo := bar();
if foo == nil { break; }
...
}但这似乎并不干净,既因为它将循环条件与循环语句本身分开,也因为它依赖于break。
那么,Go中有没有一种简洁、惯用的方式在while循环中进行赋值和比较呢?这是一个如此常见的用例,我无法想象没有办法做到这一点。
发布于 2012-10-30 03:27:31
不是的。Go没有while语句,只有for语句的特殊形式--赋值是语句,而不是表达式。你的例子是我惯用的Go。
发布于 2020-12-20 05:18:49
您可以创建一个迭代器,类似于bufio#Scanner.Scan
package main
type bar struct { foo int }
func (b *bar) next() bool {
b.foo++
return b.foo < 10
}
func main() {
var b bar
for b.next() {
println(b.foo)
}
}然后,在Next函数中,您可以放置所需的所有复杂逻辑。
https://stackoverflow.com/questions/13127929
复制相似问题