golang踩坑 3.接口值是否等于nil

就像雨总会停,雾总会散,同样地没有谁会一直失败。

详细请点击微信公众号:golang踩坑 3.接口值是否等于nil

1. 前言

这篇文章我们就来聊聊接口值等于nil这种常见类型零值的判断,有些童鞋在用的过程中难免会犯错,犯错之后又不知如何改正,那么接下来我就给大家把这个坑填上。

2. 接口值是否等于nil

具体类型的nil值, 赋值给接口值变量后, 被判定不为nil。

func main() {

    // *bytes.Buffer, 零值为nil
    var b *bytes.Buffer

    if b == nil {
        fmt.Println("外面的b等于nil")
    } else {
        fmt.Println("外面的b不等于nil")
    }

    f := func(b io.Writer) {
        if b == nil {
            fmt.Println("里面的b等于nil")
        } else {
            fmt.Println("里面的b不等于nil")
        }
    }

    // 把b传入函数
    f(b)

}

//===========输出===============

外面的b等于nil
里面的b不等于nil

原因:

golang中的接口值, 除了有自己的类型type外, 还有动态类型(dynamic type)和动态值(dynamic value). 接口值如果要被判断为nil, 需要动态类型和动态值都为nil. 可以通过fmt的"%T", “%v"观察动态类型和动态值。

3. 打印动态类型和动态值

func main() {

    var b *bytes.Buffer

    fmt.Printf("外面的b类型为%T\n", b)
    fmt.Printf("外面的b值为%v\n", b)

    if b == nil {
        fmt.Println("外面的b等于nil")
    } else {
        fmt.Println("外面的b不等于nil")
    }

    fmt.Println("")

    f := func(b io.Writer) {
        fmt.Printf("里面的b类型为%T\n", b)
        fmt.Printf("里面的b值为%v\n", b)
        if b == nil {
            fmt.Println("里面的b等于nil")
        } else {
            fmt.Println("里面的b不等于nil")
        }
    }

    f(b)

}

//==============输出=================

外面的b类型为*bytes.Buffer
外面的b值为<nil>
外面的b等于nil

里面的b类型为*bytes.Buffer
里面的b值为<nil>
里面的b不等于nil

4. 小结

我们看到当把一个具体类型赋值给接口之后,这个接口一定不是nil,因为接口的动态类型保存着具体类型的type,但是接口的动态值可能是nil,所以只要有一个不为nil,那么接口就不是nil,这个大家要在以后的代码中谨慎一些。具体大家可以看下interface的源码实现就知道为什么了。

5. 关注公众号

微信公众号:堆栈future

希望大家关注哈,原创不容易,求点赞,求关注,求分享

扫码_搜索联合传播样式-标准色版.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值