当前位置:首页 > 科技  > 软件

我们优雅判断 interface 是否为 nil

来源: 责编: 时间:2024-01-15 09:20:14 301观看
导读背景很久之前发过一篇文章:《10个令人惊叹的Go语言技巧,让你的代码更加优雅》,这篇文章中第八点有一处错误的地方被认真的读者发现了:图片于是我有空之后,立马重新看了那篇文章的内容,确实是存在读者所说的问题。问题问题就

背景

很久之前发过一篇文章:《10个令人惊叹的Go语言技巧,让你的代码更加优雅》,这篇文章中第八点有一处错误的地方被认真的读者发现了:9sj28资讯网——每日最新资讯28at.com

图片图片9sj28资讯网——每日最新资讯28at.com

于是我有空之后,立马重新看了那篇文章的内容,确实是存在读者所说的问题。9sj28资讯网——每日最新资讯28at.com

问题

问题就在于下面这句话,文章也是有列出的:9sj28资讯网——每日最新资讯28at.com

即使接口持有的值为 nil,也不意味着接口本身为 nil。9sj28资讯网——每日最新资讯28at.com

但是在执行以下语句的时候,是有可能报 panic 的:9sj28资讯网——每日最新资讯28at.com

return reflect.ValueOf(x).IsNil()

而输出也是非常明显的指出错误:9sj28资讯网——每日最新资讯28at.com

panic: reflect: call of reflect.Value.IsNil on int Value

因为不可 nil 的 interface 是不能使用 reflect.Value.IsNil 方法。9sj28资讯网——每日最新资讯28at.com

那么问题就很好解决了。9sj28资讯网——每日最新资讯28at.com

解决方式

我们在执行 reflect.Value.IsNil 方法之前,进行一次判断是否为指针即可:9sj28资讯网——每日最新资讯28at.com

func IsNil(x interface{}) bool { if x == nil {  return true } rv := reflect.ValueOf(x) return rv.Kind() == reflect.Ptr && rv.IsNil()}

重点在于 rv.Kind() == reflect.Ptr && rv.IsNil() 这段代码。9sj28资讯网——每日最新资讯28at.com

这段代码的作用:9sj28资讯网——每日最新资讯28at.com

  • 判断 x 的类型是否为指针。
  • 判断 x 的值是否真的为 nil。

下面我们使用几种常见的数据类型来进行测试:9sj28资讯网——每日最新资讯28at.com

func IsNil(x interface{}) bool { if x == nil {  return true } rv := reflect.ValueOf(x) return rv.Kind() == reflect.Ptr && rv.IsNil()}func main() { fmt.Printf("int IsNil: %t/n", IsNil(returnInt())) fmt.Printf("intPtr IsNil: %t/n", IsNil(returnIntPtr())) fmt.Printf("slice IsNil: %t/n", IsNil(returnSlice())) fmt.Printf("map IsNil: %t/n", IsNil(returnMap())) fmt.Printf("interface IsNil: %t/n", IsNil(returnInterface())) fmt.Printf("structPtr IsNil: %t/n", IsNil(returnStructPtr()))}func returnInt() interface{} { var value int return value}func returnIntPtr() interface{} { var value *int return value}func returnSlice() interface{} { var value []string return value}func returnMap() interface{} { var value map[string]struct{} return value}func returnInterface() interface{} { var value interface{} return value}type People struct { Name string}func returnStructPtr() interface{} { var value *People return value}

我们先后使用了 int、*int、slice、map、interface{}、自定义结构体 来测试此 IsNil 方法。运行程序输出为:9sj28资讯网——每日最新资讯28at.com

int IsNil: falseintPtr IsNil: trueslice IsNil: falsemap IsNil: falseinterface IsNil: truestructPtr IsNil: true

从测试结果来看,目前是符合我们对此方法的定位的。9sj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-60935-0.html我们优雅判断 interface 是否为 nil

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何在函数式编程中处理可变状态和副作用?

下一篇: 麻了,这让人绝望的大事务提交

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 华为Mate60系列模具曝光:采用硕大圆形后置相机模组+拼接配色方案

    据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将迎来更新,有望在9-10月份带来全新的华为Mate60
Top