22

在 Go 中,您可以执行以下操作:

if foo := bar() ; foo != nil {
    ...
}

在 C/C++ 中,您可以执行以下操作:

while ((foo = bar()) != NULL) {
    ...
}

但是,Go 的语法似乎没有提供任何等效的方法来在 while 循环中进行分配和比较。Go 已替换为(例如,等效于)while的特定调用。简单地尝试使用版本语法会使解析器感到困惑,因为它预计会有第三条语句。forfor afor ; a ;if

我只能说:

for foo := bar() ; foo != nil ; foo = bar() {
    ....
}

但在这种情况下,bar()调用相当长、复杂,而且不容易分解成自己的函数(虽然我可以做一些事情,比如声明一个本地func调用,但这仍然会降低代码的清晰度)。

现在我正在做:

for {
    foo := bar();
    if foo == nil { break; }
    ...
}

但这似乎不干净,既因为它将循环条件与循环语句本身分开,又因为它依赖于break.

那么,在 Go 的 while 循环中是否有一种干净、惯用的方式来进行分配和比较?这是一个如此常见的用例,我无法想象没有办法做到这一点。

4

2 回答 2

16

不,Go 没有 while 语句,只有 for 语句的特殊形式——赋值是语句,而不是表达式。你的例子是恕我直言惯用的围棋。

于 2012-10-29T19:27:30.787 回答
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函数中,你可以把你需要的所有复杂的逻辑都放进去。

于 2020-12-19T21:18:49.473 回答