前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何理解 golang nil

如何理解 golang nil

作者头像
李海彬
发布2018-03-27 14:41:49
6700
发布2018-03-27 14:41:49
举报
文章被收录于专栏:Golang语言社区Golang语言社区
golang 中的 nil 是不同于其他语言的,为了更好的理解 nil,在此我将尝试一步一步揭示 nil 在 golang 中的一些操作和现象。

1. nil 是不能比较的

code-1 Play

代码语言:javascript
复制
package main

import (

    "fmt"

)

func main() {

    fmt.Println(nil==nil)

}

code-1 输出

代码语言:javascript
复制
 

tmp/sandbox318449491/main.go:8: invalid operation: nil == nil (operator == not defined on nil

这点和 python 等动态语言是不同的,在 python 中,两个 None 值永远相等。

代码语言:javascript
复制
>>> None == None

True

>>>

从 go 的输出结果不难看出,== 对于 nil 来说是一种未定义的操作。

2. 默认 nil 是 typed 的

code-2 Play

代码语言:javascript
复制
package main

import (

        "fmt"

)

func main() {

        fmt.Printf("%T", nil) 

        print(nil)

}

code-2 输出

  1. tmp/sandbox379579345/main.go:9: use of untyped nil

复制代码

print 的输出时未指定类型的,因而无法输出

3. 不同类型 nil 的 address 是一样的

code-3 Play

代码语言:javascript
复制
package main

import (

        "fmt"

)

func main() {

        var m map[int]string

        var ptr *int

        fmt.Printf("%p", m)

        fmt.Printf("%p", ptr)

}

m 和 ptr 的 address 都是 0x0

4. 不同类型的 nil 是不能比较的

code-4 Play

代码语言:javascript
复制
package main

import (

        "fmt"

)

func main() {

        var m map[int]string

        var ptr *int

        fmt.Printf(m == ptr)

}

code-4 输出

代码语言:javascript
复制
tmp/sandbox618627491/main.go:10: invalid operation: m == ptr (mismatched types map[int]string and *int)


5. nil 是 map,slice,pointer,channel,func,interface 的零值

code-5 Play

代码语言:javascript
复制
package main

import (

        "fmt"

)

func main() {

        var m map[int]string

        var ptr *int

        var c chan int

        var sl []int

        var f func()

        var i interface{}

        fmt.Printf("%#v\n", m)

        fmt.Printf("%#v\n", ptr)

        fmt.Printf("%#v\n", c)

        fmt.Printf("%#v\n", sl)

        fmt.Printf("%#v\n", f)

        fmt.Printf("%#v\n", i)

}

code-5 输出

代码语言:javascript
复制
map[int]string(nil)

(*int)(nil)

(chan int)(nil)

[]int(nil)

(func())(nil)

<nil>

zero value 是 go 中变量在声明之后但是未初始化被赋予的该类型的一个默认值。

正确理解 nil 是正确理解 go 中类型的重要一环,因而 nil 的任何细节在遇到之后都不要错过,要做到相应的记录。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

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

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

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