首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在go的while-equivalent中赋值比较?

在go的while-equivalent中赋值比较?
EN

Stack Overflow用户
提问于 2012-10-30 02:56:56
回答 2查看 3.1K关注 0票数 22

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

代码语言:javascript
复制
if foo := bar() ; foo != nil {
    ...
}

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

代码语言:javascript
复制
while ((foo = bar()) != NULL) {
    ...
}

然而,Go的语法似乎没有提供任何在while循环中进行赋值和比较的等效方法;Go已经用特定的for调用替换了while (例如,for a等同于for ; a ;)。简单地尝试使用if版本语法会使解析器感到困惑,因为它期望有第三个语句。

我可以说:

代码语言:javascript
复制
for foo := bar() ; foo != nil ; foo = bar() {
    ....
}

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

现在我要做的是:

代码语言:javascript
复制
for {
    foo := bar();
    if foo == nil { break; }
    ...
}

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

那么,Go中有没有一种简洁、惯用的方式在while循环中进行赋值和比较呢?这是一个如此常见的用例,我无法想象没有办法做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 03:27:31

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

票数 16
EN

Stack Overflow用户

发布于 2020-12-20 05:18:49

您可以创建一个迭代器,类似于bufio#Scanner.Scan

代码语言:javascript
复制
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函数中,您可以放置所需的所有复杂逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13127929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档