理解 golang 的 nil

栏目: Go · 发布时间: 8年前

内容简介:理解 golang 的 nil

golang 中的 nil 是不同于其他语言的,为了更好的理解 nil,在此我将尝试一步一步揭示 nil 在 golang 中的一些操作和现象。

1. nil 是不能比较的

code-1 Play

package main

import (
    "fmt"
)

func main() {
    fmt.Println(nil==nil)
}

code-1 输出

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

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

>>> None == None
True
>>>

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

2. 默认 nil 是 typed 的

code-2 Play

package main

import (
	"fmt"
)

func main() {
	fmt.Printf("%T", nil) 
	print(nil)
}

code-2 输出

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

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

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

code-3 Play

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

package main

import (
	"fmt"
)

func main() {
	var m map[int]string
	var ptr *int
	fmt.Printf(m == ptr)
}

code-4 输出

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

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 输出

map[int]string(nil)
(*int)(nil)
(chan int)(nil)
[]int(nil)
(func())(nil)
<nil>

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

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

理解 golang 的 nil

关注 wecatch 公众号, 获取最新文章信息


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

打造Facebook

打造Facebook

王淮、祝文让 / 印刷工业出版社 / 2013-2-1 / 39.80元

《打造Facebook》新书发布会,王淮与读者面对面,活动链接:http://www.douban.com/event/18166913/ 这本书的书名——《打造Facebook:亲历Facebook爆发的5年》很嚣张,谁有资格可以说这句话呢,当然,扎克伯格最有资格,但他不会亲自来告诉你,至少从目前的情况来看,近几年都不大可能。而且,这不是一个人的公司。里面的每一人,尤其是工程师,既是公司文......一起来看看 《打造Facebook》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试