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!

  • 相关阅读:
    【构建工具】《Maven实战》读书笔记
    【网络安全】Dos攻击科普文
    谈谈集合.CopyOnWriteArrayList
    谈谈集合.List
    小程序开发--移动端分辨率与rpx
    跟面向对象卯上了,看看ES6的“类”
    捋一捋js面向对象的继承问题
    Canvas的drawImage方法使用
    浏览器内核趣对话
    “茴”字有四种写法,this也是一样
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/11357013.html
Copyright © 2011-2022 走看看