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 ...
随机推荐
- appium 遇到连接设备状态是offline
1.查看连接手机设备 adb derivces 时,手机状态是offline状态(无法正常连接). 解决法: 1.adb kill-server 终止adb调试服务 2.adb start-serve ...
- Arduino优化 减少重复代码 例2
Example->Blink: void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUI ...
- svn提交规范
本文档参考了Git提交规范,旨在规范使用SVN进行代码版本管理时的提交操作. 提交前的准备 1. 检查代码 在提交代码前,请先进行必要的代码检查,确保代码的正确性.可读性和可维护性.可以使用代码质量管 ...
- MS SQL Server 删除重复行数据
您可以使用以下 SQL 语句删除 MS SQL Server 表中重复的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, ...
- 玩转SpringBoot原理:掌握核心技术,成为高级开发者
本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件 步骤一:创建项目 步骤二:添加依赖 步骤三:创建自动配置类 步骤四:创建 ...
- 算法学习笔记(19): 树上启发式合并(DSU on tree)
树上启发式合并 DSU on tree,我也不知道DSU是啥意思 这是一种看似特别玄学的优化 可以把树上部分问题由 \(O(n^2)\) 优化到 \(O(n \log n)\). 例如 CodeFor ...
- linux中查看用户和组信息小结
查看当前登录用户的组内成员groups 查看当前登录用户名whoami 查看tom用户所在的组,以及组内成员groups tom 查看所有的用户信息cat /etc/passwd 用户名.密码.用户i ...
- forEach如何终止循环
try { try { this.list.forEach(item => { ..... throw new Error('end') }) } catch(err) { console.lo ...
- 【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系
并发编程的难题和挑战 在并发编程的技术领域中,对于我们而言的难题主要有两个: 多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息. 多线程的线程通信机制 在命令式编程中,线 ...
- 为什么说 ICMP 协议是网络最强辅助
大家好,我是风筝 轻解网络系列又来了.已有高清 PDF 版本可以离线阅读了,全册 65 页,如果有需要离线版的高清 PDF 可以直接下载. 今天咱们说说 ICMP 协议.ICMP 可谓是网络世界中的最 ...