Подтвердить что ты не робот

Присвоить-и-сравнить в движении в то время как эквивалент?

В 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? Это такой общий случай использования, я не могу себе представить, что нет способа сделать это.

4b9b3361

Ответ 1

Нет. Go не имеет инструкции while, только специальная форма оператора for - и присваивание является выражением, а не выражением. Ваши примеры - ИМХО, идиоматический Go.