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 ループで代入と比較を行うクリーンで慣用的な方法はありますか? これは非常に一般的なユースケースであり、それを行う方法がないとは想像できません。