zoukankan      html  css  js  c++  java
  • go中interface空指针不为nil判断方法

    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!

  • 相关阅读:
    数据(或分布)的对称、偏倚
    【python】 与日志logging相关文章推荐
    实体类和json串的转换
    欧几里德算法----最大公约数算法
    java IdentityHashMap 与HashMap
    android gradle依赖:implementation 和compile的区别
    jmeter进行文件下载的性能测试
    Asp.Net Core MVC 框架 实现钉钉扫码登入
    前端静态资源库
    28个漂亮的React.js后台管理模板
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/11357013.html
Copyright © 2011-2022 走看看