¿Asignar y comparar en el equivalente de go?
(1)
En Go puedes hacer:
if foo := bar() ; foo != nil {
...
}
En C / C ++ puedes hacer:
while ((foo = bar()) != NULL) {
...
}
Sin embargo, la sintaxis de Go no parece proporcionar una forma equivalente de realizar la asignación y comparación en un bucle while; Go ha reemplazado while
con una invocación específica de for
(por ejemplo, for a
es equivalente a for ; a ;
). Simplemente tratando de usar la sintaxis de la versión if
confunde el analizador, ya que se espera que haya una tercera declaración.
Solo podría decir:
for foo := bar() ; foo != nil ; foo = bar() {
....
}
pero en este caso, la llamada a la bar()
es bastante larga, compleja y no es fácil de romper en su propia función (aunque podría hacer algo como declarar una func
local a la que llamar, pero eso todavía reduce la claridad del código) .
Por ahora estoy haciendo:
for {
foo := bar();
if foo == nil { break; }
...
}
pero esto parece impuro, tanto porque separa los criterios de bucle de la propia instrucción de bucle, como porque se basa en la break
.
Entonces, ¿hay una forma limpia e idiomática de hacer una asignación y comparación en un bucle while en Go? Este es un caso de uso tan común que no puedo imaginar que no haya forma de hacerlo.
No. Go no tiene una sentencia while, solo la forma especial de la sentencia for, y la asignación es una sentencia, no una expresión. Tus ejemplos son IMHO idiomatic Go.