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

flu*_*ffy 19 go

在Go中你可以做到:

if foo := bar() ; foo != nil {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在C/C++中,您可以:

while ((foo = bar()) != NULL) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,Go的语法似乎没有提供在while循环中进行赋值和比较的任何等效方法; Go已替换while为特定的调用for(例如for a,相当于for ; a ;).简单地尝试使用if版本语法会使解析器混淆,因为它期望有第三个语句.

我可以说:

for foo := bar() ; foo != nil ; foo = bar() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

现在我在做:

for {
    foo := bar();
    if foo == nil { break; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是不洁净的,因为它将循环标准与循环语句本身分开,并且因为它依赖于它break.

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

zzz*_*zzz 16

不.Go没有while语句,只有for语句的特殊形式 - 而赋值是一个语句,而不是表达式.你的例子是IMHO惯用Go.

  • 这就是我所害怕的. (4认同)