You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:53:28