从map[string]struct{}取值时遇到nil指针panic问题(Golang)

从map[string]struct{}取值时遇到nil指针panic问题(Golang) 你好!😊

我遇到了一个运行时错误:无效的内存地址或空指针解引用,正在访问一个空映射:

var orgsToSendToPrometheus map[string]struct{}

func MustRegisterOverheadByOrg(org string) bool {
	if _, ok := orgsToSendToPrometheus[allOrgs]; ok {
		return true
	}
	_, ok := orgsToSendToPrometheus[org]
	return ok
}

在以下行发生恐慌:→ _, ok := orgsToSendToPrometheus[org]

据我理解,对空映射执行读取、删除、获取长度和范围循环是安全的,因为它的行为类似于空映射。

有人能帮助我吗?

谢谢!


更多关于从map[string]struct{}取值时遇到nil指针panic问题(Golang)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

我不确定问题是否出在“allOrgs”键上……

更多关于从map[string]struct{}取值时遇到nil指针panic问题(Golang)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你提到它因 org 键而 panic。

是的,规范中也指出:

一个 nil 映射等同于一个空映射,只是不能向其添加元素。

你好。你能提供错误追踪信息吗?另外,能否也说明一下 org 是从哪里来的?目前,我没有看到访问 nil 映射有什么问题:playground

Go Playground - The Go Programming Language

另请参阅:Go 编程语言规范 - Go 编程语言

“未初始化的映射的值为 nil。” … “一个新的、空的映射值是使用内置函数 make 创建的,该函数接受映射类型和 …”

问题出在映射变量 orgsToSendToPrometheus 只是声明但未初始化。在Go中,声明为 map[string]struct{} 的变量默认值为 nil。虽然从 nil 映射读取是安全的(会返回零值和 false),但你的代码中使用了 orgsToSendToPrometheus[allOrgs],这里的 allOrgs 变量未在代码片段中定义,很可能是一个未初始化的字符串变量,导致访问时出现意外行为。

以下是修复后的代码示例:

// 正确初始化映射
var orgsToSendToPrometheus = make(map[string]struct{})

// 或者使用字面量初始化
// var orgsToSendToPrometheus = map[string]struct{}{}

func MustRegisterOverheadByOrg(org string) bool {
    // 确保 allOrgs 已正确定义和初始化
    const allOrgs = "*" // 示例值
    
    if _, ok := orgsToSendToPrometheus[allOrgs]; ok {
        return true
    }
    _, ok := orgsToSendToPrometheus[org]
    return ok
}

关键点:

  1. 映射必须用 make 或字面量初始化后才能安全使用
  2. 检查 allOrgs 变量的定义和初始化
  3. 从已初始化的映射读取是安全的,即使映射为空

如果 allOrgs 是预期外的空字符串,访问 orgsToSendToPrometheus[""] 也会正常工作,但可能不是你想要的行为逻辑。

回到顶部