2016-02-04 80 views
2

Go有一個常見的成語,看起來像這樣:使用 「短分配」混合:=和=在Go if語句

if val, err := func(); err != nil { 
    /* val and err are in scope */ 
... 
} 
/* val and err are no longer in scope */ 

。我當然是粉絲。感覺與做類似:

/* code not involving val */ 
{ 
    int val; 

    if ((val = func()) == ERR_VALUE) { 
     /* Process the error */ 
    } 
    /* Do something with val */ 
} 
/* more code not involving val */ 

in C++。什麼絆倒了我的是,在那裏是第一款在多個變量的情況下,如果,他們必須具有相同的範圍,即你所要做之一:

var err error 
var val string 

if val, err = func(); err != nil { 
... 

if val, err := func(); err != nil { 
... 

一個非常常見的用例似乎是你想在if的第一個子句中設置一個變量的地方,如果沒有,則繼續執行其餘的程序流程(並且能夠使用您在執行if時分配的任何值)。但是,在我看來,如果你想做到這一點,你必須要麼:

  1. 使用一個臨時變量,然後分配一個else裏面的持久變量值:

    var val 
    
    if tempval, err := func(); err != nil { 
        /* Process the error */ 
    } else { 
        val = tempval 
    } 
    
  2. 如上所述,聲明err變量的範圍超過if。

第一個選項似乎笨重 - 被迫使用一個「其他」條款只是爲了確保該值不屬於超出範圍 - 和第二扔掉限制的範圍的優勢變量。 Go程序員在這種(看似非常普遍的)情況下使用哪些習語更有經驗?

+0

您可以隨時閱讀STDLIB源... – themihai

回答

4

The Go Programming Language Specification

If statements

「if」 語句根據一個布爾表達式的值指定兩個分支 的條件執行。如果表達式 的計算結果爲true,則執行「if」分支,否則,如果存在,則執行「else」分支 。

IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" (IfStmt | Block) ] . 

if x > max { 
    x = max 
} 

表達可以通過簡單的語句,該語句的表達式求值之前執行 之前。

if x := f(); x < y { 
    return x 
} else if x > z { 
    return z 
} else { 
    return y 
} 

如果你不能利用特殊形式的,

if val, err := fnc(); err != nil { 
    // ... 
} 

然後使用常規的形式,

val, err := fnc() 
if err != nil { 
    // ... 
} 

常規形式是圍棋語言必要和通常的形式。特殊形式是爲了方便而定義的一種專業化形式;這不是必需的。如果特殊形式比常規形式更方便使用,請使用它。否則,請使用常規表單。


Go是一個block-structured programming language追蹤它的祖先回到陵60,C,Pascal中,MODULA 2,奧伯倫。

The Go Programming Language Specification

Blocks

Declarations and scope

因此,你可以寫

x := false 
{ 
    x := true 
    if x { 
     fmt.Println(x) 
    } 
} 
fmt.Println(x) 

,或者等價地,爲方便起見,

x := false 
if x := true; x { 
    fmt.Println(x) 
} 
fmt.Println(x) 

輸出在這兩種情況下是

true 
false 
+1

但這並不回答什麼OP問?所以唯一的慣用方法是在同一範圍內聲明兩個變量(在「if」語句範圍級別或「範圍」範圍之外)??想看看這是否是結論。謝謝 - –

+0

如果特殊form只是爲了方便,還有另外一種方法可以使用一個只在if語句範圍內的變量嗎?如果沒有,那麼它不僅僅是語法上的糖,因爲你可以做很長的路要走,因爲那裏*是*沒有「很長的路」... –

+0

99%的這個答案中的單詞不會回答這個問題 – hobbs