Go中interface != nil不一定不是nil

摘要:

interface{} 值 != nil不一定不是nil,应使用reflect库判断是否是nil。

测试示例:

// todo interface != nil 不一定 不是nil
var value map[string]interface{}
reqMap := make(map[string]interface{})
reqMap["key"] = value

value2, ok := reqMap["key"]
if ok {
	fmt.Print("ok = true\n")
} else {
	fmt.Printf("ok = false, value = %v\n", value2)
}

if ok {
	var convertValue map[string]interface{}
	var newMap map[string]interface{}
	convertValue = value2.(map[string]interface{})
	newMap["new"] = convertValue
	fmt.Print(convertValue)
}

断点调试
在这里插入图片描述
在进行到断点处时,会报错“assignment to entry in nil map”
在这里插入图片描述

我们不能对一个map的value赋值为nil,在此处如果仅通过判断interface{}是否为nil,此处可能导致误判,所以这里建议通过反射进行判断。

修改方法


// CodeExplore .
func CodeExplore(ctx context.Context) {
	logs.CtxInfo(ctx, "hello world")

	// todo interface != nil 不一定 不是nil
	var value map[string]interface{}
	reqMap := make(map[string]interface{})
	reqMap["key"] = value

	// 正确
	value3, _ := reqMap["key"]
	if !isNil(value3) {  // 判断结果为false
		var newMap map[string]interface{}
		newMap["new"] = value3
	}

	// 错误
	//value2, ok := reqMap["key"]
	//if ok {
	//	fmt.Print("ok = true\n")
	//} else {
	//	fmt.Printf("ok = false, value = %v\n", value2)
	//}
	//if ok {
	//	var convertValue map[string]interface{}
	//	var newMap map[string]interface{}
	//	convertValue = value2.(map[string]interface{})
	//	newMap["new"] = convertValue
	//	fmt.Print(convertValue)
	//}

	return
}

func isNil(val interface{}) bool {
	if val == nil {
		return true
	}

	v := reflect.ValueOf(val)
	k := v.Kind()
	switch k {
	case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
		return v.IsNil()
	default:
		return false
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/286577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别?5.302和304有什么区别?6. 请描述一次完整的HTTP请求的过程。7.什么是重定向?8. 重定向和请求转发有什么区别?9.介绍…

计算机毕业设计 基于SSM的果蔬作物疾病防治系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【Amazon Bedrock】体验 Bedrock 的基本功能,为构建强大安全的LLM应用而准备

文章目录 一、什么是Amazon Bedrock?二、为什么选择 Amazon Bedrock三、访问Amazon Bedrock UI四、与Amazon Bedrock 聊天五、对比Amazon Bedrock 不同基础模型的返回结果六、让Amazon Bedrock处理文本七、利用Amazon Bedrock生成图片八、参考链接 一、什么是Amazon…

Wnmp本地部署结合内网穿透实现任意浏览器远程访问本地服务

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1…

从信号处理角度彻底理解FFT

只想速览公式可以转到简明FFT公式 一、FFT起初用于解决的问题 分解复合信号 将复合信号视为若干正弦波与余弦波的叠加,如何得知某个正弦波/余弦波在该信号中的强度? 二、即答 用特定频率的正弦波/余弦波(设其为a)乘上复合信号…

问界M9激光雷达解说

什么是激光雷达 激光雷达(英文:Lidar),是一种通过发射激光束来测量目标位置、速度等特征量的雷达系统。其工作原理是将激光光束照射到目标物体上,然后通过测量激光光束从发射到反射回来的时间,来计算目标物体的距离、位置、速度等参数。激光雷达通常用于测量地形、地貌、…

云轴科技海通期货 | 一云多芯信创云平台方案入选上海金融科技优秀解决方案

近日,在上海金融科技产业联盟主办的第五届上海金融科技国际论坛上,上海市地方金融监督管理局、中国人民银行上海总部共同发布了2023年度上海金融科技优秀应用场景及解决方案入选名单,其中云轴科技ZStack联合海通期货申报的“一云多芯信创云平…

【linux kernel】linux的SPI框架分析

文章目录 一、linux内核中的SPI框架二、SPI核心的初始化三、SPI核心的数据结构1、struct spi_statistics2、struct spi_delay3、struct spi_device4、struct spi_driver5、struct spi_controller6、struct spi_res7、struct spi_transfer8、struct spi_message9、struct spi_bo…

JavaScript中history对象常用方法【通俗易懂】

✨前言✨   本篇文章主要在于了解及使用JavaScript中history对象常用方法 🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍒博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 &#x1f4cd…

【052】基于Springboot、Vuey电影购票管理系统(附完整源码、数据库)

**基于Springboot、Vue、Mysql的电影购票管理系统(附源码、数据库),超级完整的项目,值得下载!! 链接在博客最底下**电影购票管理系统源码及数据库百度云链接: https://pan.baidu.com/s/1loetDV…

VC6.0 下载的dsw打不开解决

有位朋友发了个老项目给我,是十多年前的VC6.0写的,为此我下载了一个VC6。但当选择打开工作空间时,却没有反应,甚至会报错。提示如下: 根据提示内容,Google了一下,找到了这篇帖子:htt…

poi操作Excel给列设置下拉菜单(数据验证)

效果图&#xff1a; pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency> 12345Workbook实现类有三个&#xff1a;HSSFWork…

2024,「量子人工智能」比想象中来得更快

我们离量子人工智能的未来还有多远&#xff1f; 两种改变游戏规则的技术的蓄意碰撞有可能颠覆科技行业&#xff0c;并带来一个商业颠覆和创新的新时代。很少有行业能幸免于这场变革&#xff0c;它将创造全新的价值和风险。夸夸其谈&#xff1f;业界并不这么认为。未来&#xff…

从零开始 - 在Python中构建和训练生成对抗网络(GAN)模型

生成对抗网络&#xff08;GANs&#xff09;是一种强大的生成模型&#xff0c;可以合成新的逼真图像。通过完整的实现过程&#xff0c;读者将对GANs在幕后的工作原理有深刻的理解。本教程首先导入必要的库并加载将用于训练GAN的Fashion-MNIST数据集。然后&#xff0c;提供了构建…

2024年【通信安全员ABC证】复审考试及通信安全员ABC证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 通信安全员ABC证复审考试根据新通信安全员ABC证考试大纲要求&#xff0c;安全生产模拟考试一点通将通信安全员ABC证模拟考试试题进行汇编&#xff0c;组成一套通信安全员ABC证全真模拟考试试题&#xff0c;学员可通过…

优化模型:matlab二次规划

1.二次规划 1.1 二次规划的定义 若某非线性规划的目标函数为自变量 x x x的二次函数&#xff0c;且约束条件全是线性的&#xff0c;则称这种规划模型为二次规划。 1.2 二次规划的数学模型 min ⁡ 1 2 x T H x f T x \min \frac{1}{2}\boldsymbol{x}^{\boldsymbol{T}}\bolds…

【Matlab】RF随机森林时序预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88692249 一&#xff0c;概述 随机森林的基本思想是利用多个决策树对时序数据进行预测&#xff0c;其中每个决策树都使用不同的随机抽样方式选择训练数据&#xff0c;以减小过拟合的风险。 随机森林时序预测…

【计算机毕业设计】SSM实验室设备管理

项目介绍 本项目为后台管理系统&#xff0c;分为管理员、老师、学生三种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 信息管理&#xff1a;用户管理&#xff1b; 基础管理&#xff1a;实验室管理,实验室申请记录,设备管理,设备记录管理,耗材管理,耗材记录管理等功能…

【Java进阶篇】字符串常量、字符串常量池详解

字符串常量、字符串常量池详解 ✔️字符串常量池是如何实现的?✔️字符串常量从哪来的? ✔️字符串常量是什么时候进入到字符串常量池的? ✔️字符串常量池是如何实现的? 字符串常量池 (String Constant Pool) 是Java中一块特殊的内存区域&#xff0c;用于存储字符串常量。…

C语言——操作符

一、算数操作符 1、(加操作符) 用于将两个数相加&#xff0c;例&#xff1a;3 3结果为6 2、-(减操作符) 用于将两个数相减&#xff0c;例&#xff1a;3 - 3结果为0 3、*(乘操作符) 用于将两个数相乘&#xff0c;例&#xff1a;3 * 3结果为9 4、/(除操作符) 用于将两个…
最新文章