Go语言中指针变量使用不同赋值运算符导致程序行为异常的原因咨询
全局指针变量使用
=与:=赋值引发panic的原因 问题场景
在以下Go代码中,全局声明的指针变量appConfig用普通赋值=时程序正常运行,但用短变量声明:=时会触发panic: runtime error: invalid memory address or nil pointer dereference:
package main import "fmt" var appConfig *map[string]interface{} func main() { // 正常运行 //appConfig = &map[string]interface{}{ // "name": "marcus", //} // 触发panic appConfig := &map[string]interface{}{ "name": "marcus", } fmt.Println("Config:", *appConfig) getName() } func getName() { fmt.Println("Name is ", (*appConfig)["name"]) }
核心原因
短变量声明:=的作用是在当前作用域创建新变量,而非修改全局变量:
- 使用
=赋值时,直接对全局作用域的appConfig指针进行赋值,让它指向一个新创建的map的内存地址,此时全局变量有效,getName函数能正常解引用并访问map内容。 - 使用
:=时,Go会在main函数的局部作用域内创建一个同名的局部变量appConfig,这个局部变量仅在main函数内部有效。而全局的appConfig始终是初始的nil指针,当getName函数尝试解引用这个nil指针时,就会触发空指针panic。
验证说明
如果在main函数中分别打印全局变量和局部变量的内存地址,会发现二者完全不同:
var appConfig *map[string]interface{} func main() { fmt.Println("全局变量地址:", &appConfig) // 全局变量的地址 appConfig := &map[string]interface{}{"name": "marcus"} fmt.Println("局部变量地址:", &appConfig) // 局部变量的地址,和全局地址不一致 getName() }
内容的提问来源于stack exchange,提问作者StrangeCode
相关产品推荐
相关产品推荐

