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

我们优雅判断 interface 是否为 nil

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

背景

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

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

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

问题

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

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

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

return reflect.ValueOf(x).IsNil()

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

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

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

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

解决方式

我们在执行 reflect.Value.IsNil 方法之前,进行一次判断是否为指针即可:sG028资讯网——每日最新资讯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() 这段代码。sG028资讯网——每日最新资讯28at.com

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

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

下面我们使用几种常见的数据类型来进行测试:sG028资讯网——每日最新资讯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 方法。运行程序输出为:sG028资讯网——每日最新资讯28at.com

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

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

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

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

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

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

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top