2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?
福哥答案2020-11-10:
reflect.ValueOf(接口变量).IsNil(),用这个即可判断。对于值类型,会panic。两种方法如下:
1.异常判断:recover捕获。
2.类型判断:reflect.ValueOf(接口变量).Kind()获取类型。
golang代码如下:
package main import (
"fmt"
"reflect"
) type Person struct {
Name string
} func (*Person) GetName() { } type ITester interface {
GetName()
} func main() {
var i interface{} = nil //空值
fmt.Println("空值")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i))
fmt.Println("-----------")
i = []int(nil) //切片
fmt.Println("切片")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i))
fmt.Println("-----------")
i = map[int]int(nil) //映射
fmt.Println("映射")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i))
fmt.Println("-----------")
i = chan int(nil) //通道
fmt.Println("通道")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i))
fmt.Println("-----------")
i = (func())(nil) //函数
fmt.Println("函数")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i))
fmt.Println("-----------")
i = (*int)(nil) //指针
fmt.Println("指针")
fmt.Println("==判断:", i == nil)
fmt.Println("异常判断:", InterfaceIsNil1(i))
fmt.Println("类型判断:", InterfaceIsNil2(i)) } //异常判断
func InterfaceIsNil1(i interface{}) bool {
ret := i == nil if !ret { //需要进一步做判断
defer func() {
recover()
}()
ret = reflect.ValueOf(i).IsNil() //值类型做异常判断,会panic的
} return ret
} //类型判断
func InterfaceIsNil2(i interface{}) bool {
ret := i == nil if !ret { //需要进一步做判断
vi := reflect.ValueOf(i)
kind := reflect.ValueOf(i).Kind()
if kind == reflect.Slice ||
kind == reflect.Map ||
kind == reflect.Chan ||
kind == reflect.Interface ||
kind == reflect.Func ||
kind == reflect.Ptr {
return vi.IsNil()
}
} return ret
}
执行结果如下:

2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?的更多相关文章
- Golang中的error类型
Golang中的error类型 error类型本身就是一个预定义好的接口,里面定义了一个method type error interface { Error() string } 生成一个新的err ...
- golang中的接口值
package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...
- golang中的接口实现(一)
golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...
- POI中的CellType类型以及值的对应关系
POI 中的CellType类型以及值的对应关系 CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_TYPE_FOR ...
- 小心golang中的无类型常量
对于无类型常量,可能大家是第一次听说,但这篇我就不放进拾遗系列里了. 因为虽然名字很陌生,但我们每天都在用,每天都有无数潜在的坑被埋下.包括我本人也犯过同样的错误,当时代码已经合并并发布了,当我意识到 ...
- golang中的接口实现(二)
指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...
- POI 中的CellType类型以及值的对应关系
操作使用POI接口,了解CellType的类型和值的对应关系. CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_T ...
- golang中自定义一些类型和对应类型的指针方法
package main import "fmt" // 项目开发中可以为type声明的类型编写一些方法,从而实现对象.方法的操作 // 声明类型 type myInt int / ...
- 2017.11.10 web中URL和URI的区别
URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...
- golang中的接口
CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...
随机推荐
- Color与字符串相互转换
string myfontcolor; this.label1.ForeColor = System.Drawing.ColorTranslator.FromHtml(myfontcolor); my ...
- async 与 Thread 的错误结合
在 TAP 出现之前,我们可以通过 Thread 来完成一些线程操作,从而实现多线程和异步操作.在 TAP 出现之后,有时候为了更高精度的控制线程,我们还是会使用到 Thread .文本讲介绍一种错误 ...
- 【CS231n assignment 2022】 vscode 环境配置
文章目录 前言 一.安装 Python 二.安装 vscode 三. cs231n 作业下载 四.配置 vscode 五.虚拟环境包安装 六.数据集 前言 今年成功考上了本校的研究生,要开始进入研究生 ...
- Mathematica制作和使用程序包
步骤 这里拿你制作并且使用一个程序包lost为例子 新建一个空白.wl文档,输入代码如下 BeginPackage[ "MyPkg`"] MainFunction::usage = ...
- Spark Catalyst 查询优化器原理
这里我们讲解一下SparkSQL的优化器系统Catalyst,Catalyst本质就是一个SQL查询的优化器,而且和 大多数当前的大数据SQL处理引擎设计基本相同(Impala.Presto.Hive ...
- Ceres 自动求导解析-从原理到实践
Ceres 自动求导解析-从原理到实践 目录 Ceres 自动求导解析-从原理到实践 1.0 前言 2.0 Ceres求导简介 3.0 Ceres 自动求导原理 3.1 官方解释 3.2 自我理解 4 ...
- Python安装-在Linux系统中使用编译进行安装
Python安装-在Linux系统中使用编译进行安装 你可以使用Ubuntu自带的Python3,不过你不能自由的控制版本,还要单独安装pip3,如果你想升级pip3,还会出现一些让人不愉快的使用问题 ...
- [Linux]异常配置专题之重复配置的有效性:系统/环境变量 | hosts
1 文由 在项目中经常遇到这种情况,1个hosts文件里同一IP 或 域名存在多个映射配置,那么到底哪个有效?环境变量亦有此问题. 问题本身不难,只是为了避免混淆,进行专门记录,以加深记忆. 2 ho ...
- [Web服务容器/Apache Tomcat]WINDOWS系统下:一台机器部署多个[解压版]Tomcat
以windows为例. 1 思路 1.1 前置条件 已成功配置JDK (JAVA_HOME / Path) 控制面板>所有控制面板项>系统>高级系统设置>系统变量(S): JA ...
- 新旧版本功能对比 | v1.5.0 全新升级
Hi~社区的小伙伴们大家好呀! CloudQuery 最新 1.5.0 社区版本即将于 4月14日 发布,正式上线前,我们迫不及待与大家分享与 v1.4 相比,v1.5.0 在性能和功能上有哪些更新和 ...