登录
原创

关于变量作用于的问题

发布于 2021-05-08 阅读 302
  • 后端
  • Go
原创

下面的代码看似合理合法,但是就是编译不通过: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()
}

评论区

励志做一条安静的咸鱼,从此走上人生巅峰。

0

0

0

举报