当前位置: 首页 > news >正文

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"] = valuevalue2, 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"] = convertValuefmt.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 不一定 不是nilvar value map[string]interface{}reqMap := make(map[string]interface{})reqMap["key"] = value// 正确value3, _ := reqMap["key"]if !isNil(value3) {  // 判断结果为falsevar 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}
}

相关文章:

  • 【MySQL】MySQL 8+版本使用窗口函数可以减少一次连表操作(额外Avg函数和Using函数使用,Using关键字参考里自行了解)
  • ChatGPT在金融财务领域的10种应用方法
  • 柯桥学韩语【韩语网络用语】听说最近的年轻人都重视슬세권,역세권....吗?
  • vite4项目中,vant兼容750适配
  • C++中几个常用的类型选择模板函数
  • 【Java】java -jar 读取jar包之外的yml
  • 28 C++ 对象移动,移动构造函数,移动赋值运算符
  • 关于axios的二次封装
  • Kafka安全认证机制详解之SASL_PLAIN
  • Vue2/Vue3-插槽(全)
  • C++ KMP字符串 ||暴力算法 和 KMP算法模板题解法
  • 作业三详解
  • STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)
  • MR实战:词频统计
  • git本地创建分支并推送到远程关联起来
  • Google 是如何开发 Web 框架的
  • 10个确保微服务与容器安全的最佳实践
  • Angular 响应式表单 基础例子
  • Babel配置的不完全指南
  • Effective Java 笔记(一)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • linux安装openssl、swoole等扩展的具体步骤
  • mysql外键的使用
  • php中curl和soap方式请求服务超时问题
  • socket.io+express实现聊天室的思考(三)
  • Webpack 4x 之路 ( 四 )
  • yii2中session跨域名的问题
  • Yii源码解读-服务定位器(Service Locator)
  • 关于springcloud Gateway中的限流
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于axios的vue插件,让http请求更简单
  • 前端面试题总结
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 设计模式(12)迭代器模式(讲解+应用)
  • 实现简单的正则表达式引擎
  • 新书推荐|Windows黑客编程技术详解
  • 学习使用ExpressJS 4.0中的新Router
  • 用Visual Studio开发以太坊智能合约
  • 积累各种好的链接
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (3)llvm ir转换过程
  • (4)STL算法之比较
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)Knockout 创建自定义绑定
  • (一) springboot详细介绍
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .dwp和.webpart的区别
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET分布式缓存Memcached从入门到实战
  • .NET框架设计—常被忽视的C#设计技巧
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)