从设计上规避Go语言的 interface{} == nil 判断容易出错的简单办法
LinkerLin · · 2214 次点击 · · 开始浏览Go语言的interface{} 本质上是一个结构,含有一个type字段,一个pointer字段。
很多初学者会拿一个已经在某种情况下被赋予类型的interface{}和nil比较,然后惊讶的发现两者居然不等。
其实,从设计上,我们可以很容易规避这个问题,那就是利用Go的函数多返回值特性,在一般返回值后增加一个 ok bool类型的返回值,即可。
使用的时候,只判断最后一项返回值 ok 是不是等于true即可,完美避免了陷入x可能带有类型信息的麻烦。
对此有怀疑的同学可以比较下下面两种情况:
深究起来是因为任何指针赋值给interface{}的时候,都会把interface{}的类型信息字段给填上,于是就不等于nil了。再看下面这个例子:
变量t是一个空指针,赋值给i以后,i就不等于nil了。
为了代码的清晰可读,我建议采用本文开头推荐的函数返回值设计,绕开本文所描述的陷阱。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
Go语言的interface{} 本质上是一个结构,含有一个type字段,一个pointer字段。
很多初学者会拿一个已经在某种情况下被赋予类型的interface{}和nil比较,然后惊讶的发现两者居然不等。
其实,从设计上,我们可以很容易规避这个问题,那就是利用Go的函数多返回值特性,在一般返回值后增加一个 ok bool类型的返回值,即可。
使用的时候,只判断最后一项返回值 ok 是不是等于true即可,完美避免了陷入x可能带有类型信息的麻烦。
对此有怀疑的同学可以比较下下面两种情况:
深究起来是因为任何指针赋值给interface{}的时候,都会把interface{}的类型信息字段给填上,于是就不等于nil了。再看下面这个例子:
变量t是一个空指针,赋值给i以后,i就不等于nil了。
为了代码的清晰可读,我建议采用本文开头推荐的函数返回值设计,绕开本文所描述的陷阱。