22

Goでは次のことができます:

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

C/C++ では、次のことができます。

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

ただし、Go の構文は、while ループで代入と比較を行う同等の方法を提供していないようです。Go はwhileの特定の呼び出しに置き換えられましたfor(たとえばfor aは と同等ですfor ; a ;)。単純にifバージョン構文を使用しようとすると、3 番目のステートメントがあると予想されるため、パーサーが混乱します。

私はただ言うことができます:

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 ステートメントのみがあり、代入はステートメントであり、式ではありません。あなたの例は、私見の慣用的なGoです。

于 2012-10-29T19:27:30.787 に答える