下面的代码看似合理合法,但是就是编译不通过:panic: runtime error: invalid memory address or nil pointer dereference
var p *int
func main() {
p, err := foo()
if err != nil {
fmt.Println(err)
return
}
bar()
}
func foo() (*int, error) {
var i int = 5
return &i, nil
}
func bar() {
fmt.Println(*p)
}
主要还是变量作用域的问题,变量定义使用:=定义变量同名变量会被替换
问题就在于":="。在main这个作用域中,我们使用了
p, err := foo()
最初的理解是golang会定义新变量err,p为初始定义的那个全局变量。但实际情况是,对于使用:=定义的变量,如果新变量p与那个同名已定义变量(这里就是那个全局变量p)不在一个作用域中时,那么golang会新定义这个变量p,遮盖住全局变量p。
func main() {
//1、直接改为赋值
p, err = foo()
//2、如果实在想用:=定义变量,可以这样
// s, err := foo()
// p =s
if err != nil {
fmt.Println(err)
return
}
bar()
}