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

标签 go

当我遇到这种奇怪的行为时,我正在玩耍:

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/

相关文章:

go - 未反射(reflect)在实例上替换的字符串数组

go - 将结构追加到Go中的匿名结构 slice

go - 我不明白代码 : result = quote123(func(x int) string { return fmt. Sprintf ("%b", x) })

arrays - 如何在 Go 中保持强引用?

url - 从 Go 中的 url 资源读取

go - 为什么 goroutine 无法读取全局 var ops 值?

go - 在Golang中,json编码和编码有什么区别

xml - 在 Go 中解析 XML

shared-libraries - Go 中的共享库?

Go语言包结构