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!

  • 相关阅读:
    设计模式之设计原则
    把二叉树打印成多行
    快速排序的递归遍历和非递归遍历
    二叉树的非递归遍历
    约瑟夫环问题
    strcpy strcat strcmp memcpy函数的自己实现
    【解题模板】一些很基础的板子
    【笔记】取模运算的用法
    【OJ技巧】DSACPP pa-book中的一些提示
    【编程语言】Java基础进阶——面向对象部分
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/11357013.html
Copyright © 2011-2022 走看看