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

相关文章
|
7月前
|
编译器 Go 开发者
Golang 语言怎么使用接口编程?
Golang 语言怎么使用接口编程?
43 0
|
7小时前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
7小时前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
7小时前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口
|
7小时前
|
Go
golang学习4,glang的web接口
golang学习4,glang的web接口
|
7小时前
|
安全 Go
Golang深入浅出之-接口(Interfaces)详解:抽象、实现与空接口
【4月更文挑战第22天】Go语言接口提供抽象能力,允许类型在不暴露实现细节的情况下遵循行为约定。接口定义了一组方法签名,类型实现这些方法即实现接口,无需显式声明。接口实现是隐式的,通过确保类型具有接口所需方法来实现。空接口`interface{}`接受所有类型,常用于处理任意类型值。然而,滥用空接口可能丧失类型安全性。理解接口、隐式实现和空接口的使用能帮助编写更健壮的代码。正确使用避免方法,如确保方法签名匹配、检查接口实现和谨慎处理空接口,是关键。
21 1
|
7小时前
|
XML Go 数据格式
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
162 0
|
7小时前
|
Go
浅谈Golang接口interface
浅谈Golang接口interface
19 0
|
7小时前
|
存储 缓存 Go
Golang底层原理剖析之类型系统,接口与类型断言
Golang底层原理剖析之类型系统,接口与类型断言
53 2
|
6月前
|
运维 监控 应用服务中间件
用 Golang 采集 Nginx 接口流量大小
用 Golang 采集 Nginx 接口流量大小