福哥答案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?的更多相关文章

  1. Golang中的error类型

    Golang中的error类型 error类型本身就是一个预定义好的接口,里面定义了一个method type error interface { Error() string } 生成一个新的err ...

  2. golang中的接口值

    package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...

  3. golang中的接口实现(一)

    golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...

  4. POI中的CellType类型以及值的对应关系

    POI 中的CellType类型以及值的对应关系 CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_TYPE_FOR ...

  5. 小心golang中的无类型常量

    对于无类型常量,可能大家是第一次听说,但这篇我就不放进拾遗系列里了. 因为虽然名字很陌生,但我们每天都在用,每天都有无数潜在的坑被埋下.包括我本人也犯过同样的错误,当时代码已经合并并发布了,当我意识到 ...

  6. golang中的接口实现(二)

    指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...

  7. POI 中的CellType类型以及值的对应关系

    操作使用POI接口,了解CellType的类型和值的对应关系. CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_T ...

  8. golang中自定义一些类型和对应类型的指针方法

    package main import "fmt" // 项目开发中可以为type声明的类型编写一些方法,从而实现对象.方法的操作 // 声明类型 type myInt int / ...

  9. 2017.11.10 web中URL和URI的区别

    URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...

  10. golang中的接口

    CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...

随机推荐

  1. json.dumps和json.loads,get和post

    一.json.dumps()和json.loads()概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) json.dumps() ...

  2. jmeter设置中文

    jmeter.properties #language=enlanguage=zh_CN

  3. Gin中间件middleware

    类型 全局中间件 单个路由中间件 群组中间件 Reference

  4. 一个斜杠引发的CDN资源回源请求量飙升

    背景 一个安静的晚上,突然接到小伙伴电话线上CDN回源异常,具体表现为请求量飙升,且伴有少量请求404,其中回源请求量飙升已经持续两天但一直未被发现,直到最近404请求触发了告警后分析log才同时发现 ...

  5. $\mathcal{Friends\,\,Of\,--Mathic}$

  6. [Linux]常用命令之【ulimit(资源限制)】

    0 常见问题 [WARN ] 2018-06-15 16:55:20,831 --New I/O server boss #1 ([id: 0x55007b59, /0.0.0.0:20880])-- ...

  7. mysql数据库的登录脚本

    ######################## ku脚本: 可以使用以下ku脚本,它可以根据提供的参数登录到MySQL数据库: #!/bin/bash # Check for correct num ...

  8. day40:MySQL:python操作mysql:pymysql模块&SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...

  9. iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践

    作者:京东零售 姜海 灵动岛是苹果在iPhone 14 Pro和iPhone 14 Pro Max上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅.当有来电.短信等通知时,灵动 ...

  10. ubuntu容器的远程xface桌面环境搭建

    一.container: ubuntu20.04 二.commands: apt install xfce4 tigervnc-standalone-server  # xface使用gdm3启动器 ...