2012-10-29 15 views
17

In Vai si può fare:Assegna-e-confronta in go-while-equivalent?

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

In C/C++ si può fare:

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

Tuttavia, la sintassi di Go non sembra fornire alcun modo equivalente di fare assegnare-e-compare in un ciclo while; Go ha sostituito while con una chiamata specifica di for (ad esempio for a equivale a for ; a ;). Semplicemente cercando di usare la sintassi della versione if confonde il parser, poiché si aspetta che ci sia una terza dichiarazione.

potrei solo dire:

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

ma in questo caso, la chiamata bar() è abbastanza lungo, complesso, e non facile da rompere fuori nella sua funzione (anche se avrei potuto fare qualcosa di simile a dichiarare un locale func da chiamare, ma ciò riduce ancora la chiarezza del codice).

Per ora sto facendo:

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

ma questo sembra sporco, sia perché separa i criteri di loop dalla dichiarazione del ciclo stesso, e perché si basa su break.

Quindi, c'è un modo pulito e idiomatico di eseguire un assegnamento e un confronto in un ciclo while in Go? Questo è un caso di uso comune che non riesco a immaginare che non ci sia modo di farlo.

risposta

14

No. Go non ha istruzione while, solo la forma speciale dell'istruzione for - e l'assegnazione è un'istruzione, non un'espressione. I tuoi esempi sono IMHO idiomatici Go.

+4

Questo è quello che temevo. – fluffy