本文主要是介绍golang踩坑 3.接口值是否等于nil,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
就像雨总会停,雾总会散,同样地没有谁会一直失败。
详细请点击微信公众号:golang踩坑 3.接口值是否等于nil
1. 前言
这篇文章我们就来聊聊接口值等于nil这种常见类型零值的判断,有些童鞋在用的过程中难免会犯错,犯错之后又不知如何改正,那么接下来我就给大家把这个坑填上。
2. 接口值是否等于nil
具体类型的nil值, 赋值给接口值变量后, 被判定不为nil。
func main() {// *bytes.Buffer, 零值为nilvar b *bytes.Bufferif 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.Bufferfmt.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
希望大家关注哈,原创不容易,求点赞,求关注,求分享
这篇关于golang踩坑 3.接口值是否等于nil的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!