在Go中你可以这样做:
if foo := bar() ; foo != nil {
...
}
在C / C ++中你可以这样做:
while ((foo = bar()) != NULL) {
...
}
然而,Go的语法似乎没有提供在while循环中进行assign-and-compare的任何等效方法; Go已将while
替换为for
的特定调用(例如for a
等同于for ; a ;
)。简单地尝试使用if
版本语法会使解析器混淆,因为它期望有第三个语句。
我可以说:
for foo := bar() ; foo != nil ; foo = bar() {
....
}
但是在这种情况下,bar()
调用相当长,很复杂,并且不容易分解为自己的函数(虽然我可以做一些事情,比如声明本地func
来调用,但是这仍然会降低代码的清晰度。)
现在我在做:
for {
foo := bar();
if foo == nil { break; }
...
}
但这似乎是不洁净的,因为它将循环标准与循环语句本身分开,并且因为它依赖于break
。
那么,在Go中的while循环中是否有一种干净,惯用的方式进行分配和比较?这是一个常见的用例,我无法想象没有办法做到这一点。
答案 0 :(得分:15)
没有。 Go没有while语句,只有for语句的特殊形式 - 而赋值是一个语句,而不是表达式。你的例子是IMHO惯用Go。
答案 1 :(得分:0)
您可以创建一个迭代器,类似于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
函数中,可以放入所有需要的复杂逻辑。