如何在短變量聲明中從不同塊中重新聲明變量?在短變量聲明中從不同塊中重新聲明變量
func f() (err os.Error) {
proc, err := os.StartProcess(blah blah blah)
// the new err masks the return value?
}
有一個long thread這一點,和issue,但我感興趣的是如何解決這個暫且。
如何在短變量聲明中從不同塊中重新聲明變量?在短變量聲明中從不同塊中重新聲明變量
func f() (err os.Error) {
proc, err := os.StartProcess(blah blah blah)
// the new err masks the return value?
}
有一個long thread這一點,和issue,但我感興趣的是如何解決這個暫且。
爲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
。
無法繞過:=
聲明的範圍規則。只需使用var
和=
即可。
你能提供一個例子嗎? – 2011-02-17 16:33:08
@MattJoiner我爲我的答案添加了一個顯式的常規變量聲明的例子。 – peterSO 2011-02-17 22:33:58