2012-10-29 43 views
17

在去,你可以這樣做:指定並比較go-while-equivalent?

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

在C/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

那麼,有沒有一種乾淨的,習慣於在Go中的while循環中進行賦值和比較的方式?這是一個很常見的用例,我無法想象沒有辦法做到這一點。

回答

14

否Go沒有while語句,只有for語句的特殊形式 - 並且assign是語句,而不是表達式。你的例子是恕我直言慣用的去。

+4

這就是我所害怕的。 – fluffy