2011-02-17 129 views

回答

1

short variable declarations的圍棋規範是明確的:

短變量聲明可以提供 重新聲明變量它們 最初在相同塊 用相同類型聲明的,和至少一個 的非-blank變量是新的。

因此,在一個簡短的變量聲明中,不能重新聲明最初在不同的塊中聲明的變量。

下面是在外部塊中聲明的是如何通過聲明在內部塊的局部變量(e)和它(e)賦值給一個變量(err2)來解決這個限制的例子。

package main 

import (
    "fmt" 
    "os" 
) 

func f() (err1 os.Error, err2 os.Error) { 
    fi, err1 := os.Stat("== err1 os.Error ==") 
    _ = fi 
    { 
     fi, e := os.Stat("== e os.Error ==") 
     _ = fi 
     err2 = e 
    } 
    return 
} 

func main() { 
    err1, err2 := f() 
    fmt.Println("f() err1:", err1) 
    fmt.Println("f() err2:", err2) 
} 

輸出:

f() err1: stat == err1 os.Error ==: no such file or directory 
f() err2: stat == e os.Error ==: no such file or directory 

這裏是前面的例子改寫爲使用明確的規則variable declarations並命名爲function parameters,而不是隱short variable declarations。變量聲明總是可以顯式編寫爲常規變量聲明或命名函數參數;隱式短變量聲明僅僅是常規變量聲明的簡寫。

package main 

import (
    "fmt" 
    "os" 
) 

func f() (err1 os.Error, err2 os.Error) { 
    var fi *os.FileInfo 
    fi, err1 = os.Stat("== err1 os.Error ==") 
    _ = fi 
    { 
     var fi *os.FileInfo 
     fi, err2 = os.Stat("== err2 os.Error ==") 
     _ = fi 
    } 
    return 
} 

func main() { 
    err1, err2 := f() 
    fmt.Println("f() err1:", err1) 
    fmt.Println("f() err2:", err2) 
} 

輸出:

f() err1: stat == err1 os.Error ==: no such file or directory 
f() err2: stat == err2 os.Error ==: no such file or directory 

在您的例子中,err短變量聲明redeclares的err返回參數聲明;他們在同一個街區。因此,新的err不會屏蔽返回參數err

0

無法繞過:=聲明的範圍規則。只需使用var=即可。

+0

你能提供一個例子嗎? – 2011-02-17 16:33:08

+0

@MattJoiner我爲我的答案添加了一個顯式的常規變量聲明的例子。 – peterSO 2011-02-17 22:33:58