Go语言 当我对指针变量使用不同的赋值运算符时,程序的行为会有所不同

mgdq6dx1  于 2023-04-09  发布在  Go
关注(0)|答案(1)|浏览(100)

我正玩着玩着就遇到了这种奇怪的行为:

package main

import "fmt"

var appConfig *map[string]interface{}

func main() {
    // Works fine
    //appConfig = &map[string]interface{}{
    //  "name": "marcus",
    //}
    // Causes panic: runtime error: invalid memory address or nil pointer dereference
    appConfig := &map[string]interface{}{
        "name": "marcus",
    }
    fmt.Println("Config:", *appConfig)
    getName()
}

func getName() {
    fmt.Println("Name is ", (*appConfig)["name"])
}

我不明白为什么如果我使用短变量声明:=而不是普通的=赋值运算符,程序会崩溃。有人能告诉我行为差异背后的原因吗?提前感谢。

bejyjqdl

bejyjqdl1#

在第二个例子中,当你使用短变量声明(:=)时,你在main函数的作用域中创建了一个名为appConfig的新局部变量,它与你在代码开头声明的全局变量appConfig不同。
当你使用普通赋值操作符(=)时,你将一个Map指针赋值给全局变量appConfig。这意味着当你调用getName()时,它可以访问全局变量appConfig并获得正确的值。
然而,当你使用短变量声明(:=)时,你在main函数的作用域中创建了一个新的局部appConfig变量,而全局appConfig变量保持未初始化(nil)。当你调用getName()时,它试图访问全局appConfig变量,该变量仍然是nil,导致死机。

**TL;DR:**您需要使用普通赋值运算符(=)来确保将值赋给全局appConfig变量。

相关问题