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!

  • 相关阅读:
    flask框架(一):初入
    .py文件打包成.exe文件
    gtk+-3.21.4 static build step in windows XP
    cairo-1.14.6 static compiler msys mingw32
    ffmpeg-20160811-bin.7z
    gtk+2.24.0-glib-2.28.1-staticLib-mingw32-x86-2016-08-10.7z
    ffmpeg-20160806-bin.7z
    glib-2.49.4-msys-x86-staticLib.7z
    Tesseract-OCR text2image.exe [ x86 支持 XP ]
    ffmpeg-20160803-bin.7z
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/11357013.html
Copyright © 2011-2022 走看看