go - 在 go 的 while-equivalent 中分配和比较?

标签 go

在 Go 中你可以这样做:

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

在 C/C++ 中你可以这样做:

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

然而,Go 的语法似乎没有提供任何等效的方法来在 while 循环中进行分配和比较; 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 循环中是否有一种干净、惯用的方式来进行分配和比较?这是一个如此常见的用例,我无法想象没有办法做到这一点。

最佳答案

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

关于go - 在 go 的 while-equivalent 中分配和比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127929/

相关文章:

go - 未实现的 desc = 未知服务 pb.AuthService 我的简单例份验证服务器上出现错误

arrays - 将 json 中以逗号分隔的字符串或 int 值解码到数组

xml - Golang xml 不解码

go - 在golang regex中取消整个字符串

GOPL : Binary assignment operator "saves us from re-evaluation?"

go - 需要帮助了解 libchan 的工作原理

pointers - 反射匿名结构体字段指针

json - 接口(interface)转换: interface is map[string]interface {} not

谷歌容器生成器 : How to install govendor dependencies during build step?

scala - 在 AWS EMR SDK 中使用 AddJobFlowStep 的正确方法是什么?