В Go вы можете сделать:
if foo := bar() ; foo != nil {
...
}
В 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
.
Итак, есть ли чистый, идиоматический способ выполнения привязки и сравнения в цикле while в Go? Это такой общий случай использования, я не могу себе представить, что нет способа сделать это.