为什么testC()
在下面的go代码中编译失败?我希望该行为与 testB()
的行为相匹配,但 err
的范围仅限于 if block 。
编译器提供的错误信息是resp declared and not used
package main
import "fmt"
func main() {
testA()
testB()
testC()
testD()
}
// valid
func testA() {
resp, err := generateInt()
fmt.Println(fmt.Sprintf("Resp=%v Error=%v", resp, err))
}
// valid
func testB() {
var resp *int
resp, err := generateInt()
fmt.Println(fmt.Sprintf("Resp=%v Error=%v", resp, err))
}
// does not compile
func testC() {
var resp *int
if resp, err := generateInt(); err != nil {
fmt.Println("error=%v", err)
return
}
fmt.Println("Resp=%d", *resp)
}
// valid
func testD() {
var resp *int
var err error
if resp, err = generateInt(); err != nil {
fmt.Println("error=%v", err)
return
}
fmt.Println("Resp=%d", *resp)
}
func generateInt() (*int, error) {
result := 5
return &result, nil
}
最佳答案
在这个例子中:
var resp *int
if resp, err := generateInt(); err != nil {
short variable declaration正在重新声明 resp
变量。因为 if 语句的作用域在 if block 内部,所以它只会隐藏该 block 中的第一个 resp
变量,而第一个未被使用。
关于go - 为什么这里不允许声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725694/