前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go 判定对象为nil

go 判定对象为nil

作者头像
超级大猪
发布2020-07-06 10:53:04
1.7K0
发布2020-07-06 10:53:04
举报
文章被收录于专栏:大猪的笔记大猪的笔记

在go中,对类型明确的对象,要判定它是不是nil简单

func test1(v *teststr) {
    if v == nil {
        fmt.Println("value is nil")
        return
    }
    fmt.Println("value is not nil")
}

但是如果参数是一个interface,那情况就不同了。Interface包含类型还有值两个属性。比如:

type teststr struct {
}

func test(i interface{}) bool {
    v, ok:= i.(*teststr)
    fmt.Println("type is ok:", ok)
    if i == nil {
        fmt.Println("interface is nil")
        return false
    }

    if v == nil {
        fmt.Println("value is nil")
        return false
    }
    fmt.Println("value and interface is not nil")
    return true
}

当声明一个变量然后传入(值为nil)

    var nilVal *teststr
    test(nilVal) // value is nil

传入真正的nil

    test(nil) // type is ok false  \n  interface is nil

另外,如果interface传入真正的nil,对它做任何类型断言,都是失败的。 结论: 对于函数,传入值是interface,想判定它是不是nil:

func test(i interface{}) bool {
    // 判定是不是真正的nil
    if i == nil {
        fmt.Println("interface is nil")
        return false
    }
    // 做类型断言
    v, ok := i.(*teststr)
    if !ok{
        fmt.Println("type is not ok")
        return false
    }
    // 判定断言后的类型的值,是不是nil
    if v == nil {
        fmt.Println("value is nil")
        return false
    }
    fmt.Println("value and interface is not nil")
    return true
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档