golang踩坑 3.接口值是否等于nil

2024-01-31 14:38
文章标签 接口 golang 是否 等于 nil

本文主要是介绍golang踩坑 3.接口值是否等于nil,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

就像雨总会停,雾总会散,同样地没有谁会一直失败。

详细请点击微信公众号:golang踩坑 3.接口值是否等于nil

1. 前言

这篇文章我们就来聊聊接口值等于nil这种常见类型零值的判断,有些童鞋在用的过程中难免会犯错,犯错之后又不知如何改正,那么接下来我就给大家把这个坑填上。

2. 接口值是否等于nil

具体类型的nil值, 赋值给接口值变量后, 被判定不为nil。

func main() {// *bytes.Buffer, 零值为nilvar b *bytes.Bufferif b == nil {fmt.Println("外面的b等于nil")} else {fmt.Println("外面的b不等于nil")}f := func(b io.Writer) {if b == nil {fmt.Println("里面的b等于nil")} else {fmt.Println("里面的b不等于nil")}}// 把b传入函数f(b)}//===========输出===============外面的b等于nil
里面的b不等于nil

原因:

golang中的接口值, 除了有自己的类型type外, 还有动态类型(dynamic type)和动态值(dynamic value). 接口值如果要被判断为nil, 需要动态类型和动态值都为nil. 可以通过fmt的"%T", “%v"观察动态类型和动态值。

3. 打印动态类型和动态值

func main() {var b *bytes.Bufferfmt.Printf("外面的b类型为%T\n", b)fmt.Printf("外面的b值为%v\n", b)if b == nil {fmt.Println("外面的b等于nil")} else {fmt.Println("外面的b不等于nil")}fmt.Println("")f := func(b io.Writer) {fmt.Printf("里面的b类型为%T\n", b)fmt.Printf("里面的b值为%v\n", b)if b == nil {fmt.Println("里面的b等于nil")} else {fmt.Println("里面的b不等于nil")}}f(b)}//==============输出=================外面的b类型为*bytes.Buffer
外面的b值为<nil>
外面的b等于nil里面的b类型为*bytes.Buffer
里面的b值为<nil>
里面的b不等于nil

4. 小结

我们看到当把一个具体类型赋值给接口之后,这个接口一定不是nil,因为接口的动态类型保存着具体类型的type,但是接口的动态值可能是nil,所以只要有一个不为nil,那么接口就不是nil,这个大家要在以后的代码中谨慎一些。具体大家可以看下interface的源码实现就知道为什么了。

5. 关注公众号

微信公众号:堆栈future

希望大家关注哈,原创不容易,求点赞,求关注,求分享

扫码_搜索联合传播样式-标准色版.png

这篇关于golang踩坑 3.接口值是否等于nil的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664114

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor