在go的while等效时间内分配并比较?

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


慕虎7371278
浏览 184回答 2
2回答

qq_笑_17

不。Go没有while语句,只有for语句的特殊形式-赋值是一个语句,而不是表达式。您的示例是恕我直言惯用的Go。

拉莫斯之舞

您可以创建类似于bufio#Scanner.Scan的迭代器:package maintype Bar struct {&nbsp; &nbsp;Foo int}func (o *Bar) Next() bool {&nbsp; &nbsp;o.Foo++&nbsp; &nbsp;return o.Foo < 10}func main() {&nbsp; &nbsp;var o Bar&nbsp; &nbsp;for o.Next() {&nbsp; &nbsp; &nbsp; println(o.Foo)&nbsp; &nbsp;}}然后Next,您可以在函数中放入所需的所有复杂逻辑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go