当我遇到这种奇怪的行为时,我正在玩耍:
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"])
}
我不明白为什么如果我使用短变量声明 :=
而不是简单的 =
赋值运算符,程序会崩溃。有人可以启发我了解行为差异背后的原因吗?提前致谢。
最佳答案
您面临的问题是由于可变阴影造成的。在第二个示例中,当您使用短变量声明 (:=) 时,您会在主函数的作用域内创建一个名为 appConfig
的新局部变量,该变量与全局 appConfig
不同code> 您在代码开头声明的变量。
当您使用普通赋值运算符 (=) 时,您会将指向全局 appConfig
变量的映射的指针分配给全局 appConfig
变量。这意味着当您调用 getName()
时,它可以访问全局 appConfig
变量并获取正确的值。
但是,当您使用短变量声明 (:=) 时,您会在 main
函数范围内创建一个新的本地 appConfig
变量,并在全局 code>appConfig
变量保持未初始化状态(nil)。当您调用 getName()
时,它会尝试访问全局 appConfig
变量,但该变量仍为 nil,从而导致 panic 。
TL;DR:您需要使用简单的赋值运算符 (=) 来确保将值赋给全局 appConfig
变量。
关于go - 当我对指针变量使用不同的赋值运算符时,程序的行为有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75948049/