从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
我不确定问题是否出在“allOrgs”键上……
更多关于从map[string]struct{}取值时遇到nil指针panic问题(Golang)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你提到它因 org 键而 panic。
是的,规范中也指出:
一个
nil映射等同于一个空映射,只是不能向其添加元素。
你好。你能提供错误追踪信息吗?另外,能否也说明一下 org 是从哪里来的?目前,我没有看到访问 nil 映射有什么问题:playground
问题出在映射变量 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
}
关键点:
- 映射必须用
make或字面量初始化后才能安全使用 - 检查
allOrgs变量的定义和初始化 - 从已初始化的映射读取是安全的,即使映射为空
如果 allOrgs 是预期外的空字符串,访问 orgsToSendToPrometheus[""] 也会正常工作,但可能不是你想要的行为逻辑。


