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

我们优雅判断 interface 是否为 nil

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

背景

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

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

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

问题

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

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

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

return reflect.ValueOf(x).IsNil()

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

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

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

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

解决方式

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 《英雄联盟》夏季赛总决赛今日开打!JDG对阵LNG首发名单来了 Knight:准备三连冠

    8月5日消息,今日17:00,《英雄联盟》2023LPL夏季赛总决赛将正式开打,由JDG对阵LNG。对两支队伍来说,这场比赛不仅要争夺夏季赛冠军,更要决定谁才是LPL赛区一
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
Top