我正玩着玩着就遇到了这种奇怪的行为:
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"])
}
我不明白为什么如果我使用短变量声明:=
而不是普通的=
赋值运算符,程序会崩溃。有人能告诉我行为差异背后的原因吗?提前感谢。
1条答案
按热度按时间bejyjqdl1#
在第二个例子中,当你使用短变量声明(:=)时,你在main函数的作用域中创建了一个名为
appConfig
的新局部变量,它与你在代码开头声明的全局变量appConfig
不同。当你使用普通赋值操作符(=)时,你将一个Map指针赋值给全局变量
appConfig
。这意味着当你调用getName()
时,它可以访问全局变量appConfig
并获得正确的值。然而,当你使用短变量声明(:=)时,你在
main
函数的作用域中创建了一个新的局部appConfig
变量,而全局appConfig
变量保持未初始化(nil)。当你调用getName()
时,它试图访问全局appConfig
变量,该变量仍然是nil,导致死机。**TL;DR:**您需要使用普通赋值运算符(=)来确保将值赋给全局
appConfig
变量。