Golang踩坑——判断map中是否有key

本文记录了一次在Golang中遇到的map使用陷阱,通过示例代码展示了如何检查map中是否存在某个key,避免引发nil指针错误。问题在于使用`a, ok := map[key]`时,即使`ok`为false,`a`仍会被赋值为nil,导致后续操作出错。解决方案是仅检查`ok`,忽略`a`的值,即`_, ok := map[key]`。" 105420680,8524623,Python OpenCV:图像缩放与翻转,"['Python', '计算机视觉', 'OpenCV']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在实习,下班回去十点多了,再加上比较懒,快有两个月没写东西了。今天在开发一个模块的时候是接着上一个人的写的,好不容易各种配置写好了开始跑,发现他踩了一个很容易踩的坑。


把bug抽出来单独写了个文件。

package main

import (
	"log"
)

type agent struct {
	id  int
	str string
}

var m map[int]*agent

func main() {
	m = make(map[int]*agent)
	a := &agent{
		id:  1,
		str: "hello",
	}
	log.Println(a)
	var ok bool
	if a, ok = m[1]; ok {
		log.Println("ok")
	}
	m[1] = a
	log.Println(a)
	log.Println(a.str)
}

运行一下

可以看到报了无效指针的问题(invalid memory address or nil pointer dereference)。从上面的两个log可以看到,最开始指针是有值的,第二个却没了,原因就出现在那个if判断那里。

if判断是想通过查看map知道agent是否已经存在,这个地方的错误是a,ok = map; 我们想通过ok判断是否存在,但是在这里还有个a,这会导致有一个对a赋值的操作,也就是说如果map里有这个值,那没事,如果没有的话a就被赋值成了nil了。在下面打印的时候也就成了nil,取它的属性的时候会告诉我们找了个空指针的属性,这肯定找不到。

我们把a换成_,再来看结果:

ok了。

 

 


记录每天解决的小问题,积累起来去解决大问题。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值