分配和比较go的等同时间?

时间:2012-10-29 18:56:56

标签: go

在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循环中是否有一种干净,惯用的方式进行分配和比较?这是一个常见的用例,我无法想象没有办法做到这一点。

2 个答案:

答案 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函数中,可以放入所有需要的复杂逻辑。