zoukankan      html  css  js  c++  java
  • 2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?

    福哥答案2020-11-10:

    reflect.ValueOf(接口变量).IsNil(),用这个即可判断。对于值类型,会panic。两种方法如下:
    1.异常判断:recover捕获。
    2.类型判断:reflect.ValueOf(接口变量).Kind()获取类型。

    golang代码如下:

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type Person struct {
        Name string
    }
    
    func (*Person) GetName() {
    
    }
    
    type ITester interface {
        GetName()
    }
    
    func main() {
        var i interface{} = nil //空值
        fmt.Println("空值")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
        fmt.Println("-----------")
        i = []int(nil) //切片
        fmt.Println("切片")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
        fmt.Println("-----------")
        i = map[int]int(nil) //映射
        fmt.Println("映射")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
        fmt.Println("-----------")
        i = chan int(nil) //通道
        fmt.Println("通道")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
        fmt.Println("-----------")
        i = (func())(nil) //函数
        fmt.Println("函数")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
        fmt.Println("-----------")
        i = (*int)(nil) //指针
        fmt.Println("指针")
        fmt.Println("==判断:", i == nil)
        fmt.Println("异常判断:", InterfaceIsNil1(i))
        fmt.Println("类型判断:", InterfaceIsNil2(i))
    
    }
    
    //异常判断
    func InterfaceIsNil1(i interface{}) bool {
        ret := i == nil
    
        if !ret { //需要进一步做判断
            defer func() {
                recover()
            }()
            ret = reflect.ValueOf(i).IsNil() //值类型做异常判断,会panic的
        }
    
        return ret
    }
    
    //类型判断
    func InterfaceIsNil2(i interface{}) bool {
        ret := i == nil
    
        if !ret { //需要进一步做判断
            vi := reflect.ValueOf(i)
            kind := reflect.ValueOf(i).Kind()
            if kind == reflect.Slice ||
                kind == reflect.Map ||
                kind == reflect.Chan ||
                kind == reflect.Interface ||
                kind == reflect.Func ||
                kind == reflect.Ptr {
                return vi.IsNil()
            }
        }
    
        return ret
    }
    

      执行结果如下:

  • 相关阅读:
    第一次迭代心得
    RDF搜索引擎——需求分析心得
    RDF搜索引擎——数据库设计心得
    RDF搜索引擎——数据库具体设计
    服务器上修改运行scala
    结对编程项目的收获与总结(支持UI背景与背景音乐的刷题器)
    取长补短——结对编程项目之队友代码分析
    团队项目——测试心得
    第一次迭代开发心得
    团队项目——需求心得
  • 原文地址:https://www.cnblogs.com/waitmoon/p/13956393.html
Copyright © 2011-2022 走看看