interface空指针不为nil

当把一个空指针对象赋值给一个interface后,再判断!= nil就不再成立了

代码如下

package main

import "fmt"

type Person interface {
Name() string
} type ChenQiongHe struct {
} func (t *ChenQiongHe) Name() string {
return "雪山飞猪"
} func main() {
var test *ChenQiongHe
if test == nil {
fmt.Println("test == nil")
} else {
fmt.Println("test != nil")
}
//将空指针赋值给接口
var person Person = test
if person == nil {
fmt.Print("person == nil")
} else {
fmt.Print("person != nil")
}
}

运行结果

test == nil
person != nil

test本来是nil,赋值给person后居然不能再用nil判断了

解决方法

使用reflect包的IsNil判断,封装为一个能用方法

func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}

全部示例代码

package main

import (
"fmt"
"reflect"
) type Person interface {
Name() string
} type ChenQiongHe struct {
} func (t *ChenQiongHe) Name() string {
return "雪山飞猪"
} func main() {
var test *ChenQiongHe
if test == nil {
fmt.Println("test == nil")
} else {
fmt.Println("test != nil")
}
//将空指针赋值给接口
var person Person = test
if IsNil(person) {
fmt.Print("person == nil")
} else {
fmt.Print("person != nil")
}
} func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}

运行结果

test == nil
person == nil

完美解决,light weight baby!

go中interface空指针不为nil判断方法的更多相关文章

  1. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  2. 使用interface与类型诊断机制判断一个类型是否实现了某个方法

    Golang中的interface通常用来定义接口,在接口里提供一些方法,其他类型可以实现(implement)这些方法,通过将接口指针指向不同的类型实例实现多态(polymorphism),这是in ...

  3. Golang 空指针nil的方法和数据成员

    golang中,有一个特殊的指针值nil. 如何使用nil没有方法和成员变量呢? 下面来看下具体例子. 程序中,定义结构体类型Plane, 将Plane类型的指针作为函数的参数,然后传入nil作为实参 ...

  4. [转]Objective-c中@interface、@implementation、@protocal

    原处:http://blog.csdn.net/l271640625/article/details/8393531 以下Objective-c简称OC 从事java开发的程序员们都知道,在java中 ...

  5. Java(5/6和8)中interface和Abstract Class

    这篇文章主要是自己在使用java的过程中对自己一些之前常困惑的问题的一些总结. 正如题目所言,这篇博客主要是讨论java中的接口与抽象类的区别,有自己的使用心得,以及自己平时在使用的过程中遇到的问题及 ...

  6. Objective-C中.h文件、.m文件中@interface、@synthesize及其它

    很多开发iOS好几年的老鸟,可能都不太分的清.h文件和.m文件里各种结构的用途和区别.最近仔细研究了一下,写一篇文章记下来. 一般的,写一个Class的时候,经常是这种格式(以UIViewContro ...

  7. 3-java中String值为空字符串与null的判断方法

    java中String值为空字符串与null的判断方法 2018年01月21日 14:53:45 阅读数:1189 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个 ...

  8. python 判断矩阵中每行非零个数的方法

    python 判断矩阵中每行非零个数的方法: # -*- coding: utf-8 -*- # @Time : 2018/5/17 15:05 # @Author : Sizer # @Site : ...

  9. 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)

    从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...

随机推荐

  1. EF中获取当前上下文的表名

    EF在处理并发上并不是很好,很多时候我们需要手动写sql操作数据库.但是在基类中我们如何获取当前服务仓储操作的表呢? 使用正则是其中一种解决办法 Repository.Table是一条查询语句,通过t ...

  2. python基础(26):类的成员(字段、方法、属性)

    1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...

  3. nikto---基本使用

    目录 一:基本使用 二:调节扫描过程 三:命令行选项 四:配置文件 注意:使用版本:Nikto v2.1.6 功能:Web服务器评估工具,目的在于查找任何类型的Web服务器的各种默认和不安全的文件,配 ...

  4. java报错问题记录

    java.lang.NoSuchMethodError 运行时错误,再编译期一般不会出现这个问题.NoSuchMethodError中文意思是没有找到方法,遇到这个错误并不是说依赖的jar包.方法不存 ...

  5. Redis哨兵模式大key优化

    目前,Redis哨兵模式,内存资源有限,有很多key大于500M,性能待优化.需要迁移至Redis-cluster集群中.        涉及到的key如下: 0,hash,duser_record, ...

  6. Android 安全攻防(二): SEAndroid bionic

    转自:http://blog.csdn.net/yiyaaixuexi/article/details/8490886 最近研究SEAndroid,会陆续对各个模块做对比分析,学习移植SELinux至 ...

  7. Hive优化面试题

    对待像我这种2年开发经验的同学 一般都会被问到. 在面试中,我们只要简短的介绍就好了. 首先低调一波,我可能懂的比你少,我就简单说说 1.在排序中,我们使用的是sortBy,它是基于索引,效率高于or ...

  8. redis常规命令记录

      概述 因为redis是单线程执行,所以不用关心并发问题. 简单记录一下redis的操作命令,留作查阅,回头再整理一下事物等操作. reids中存储的是kev-value形式, 其中的value有几 ...

  9. 好用的代码统计小工具SourceCounter(下载)

    SourceCounter下载链接 https://pan.baidu.com/s/12Cg51L0hRn5w-m1NQJ-Xlg 提取码:i1cd 很多时候我们需要统计自己所写的代码的数量.举个栗子 ...

  10. jQuery function函数详解

    一.$(function(){}); $(document).ready(function(){})可以简写成$(function(){}); $(document).ready 里的代码是在页面内容 ...