go语言之nil
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言之nil相关的知识,希望对你有一定的参考价值。
在go语言中,nil是一个零值,如果我们在声明整数的时候没有为变量赋值,那么该整数的值默认是0,如果是一个指针没有明确的指向,它的值就是nil,除了指针,nil还标识切片、映射和接口的零值。
如果对一个指针进行解引用程序会崩溃
var abc *int
fmt.Println(*abc)
为了避免程序崩溃,需要通过对nil判断进行避免
if(abc != nil)
fmt.Println(*abc)
当变量被声明为函数类型时,它的默认值为nil。
var fn func(a,b int) int
fmt.Println(fn == nil)
这时候如果需要用到fn就需要进行判断是否nil。
切片如果声明之后没有通过内置的make或者复合字面量进行的初始化,它的值将是nil,切片的许多方法可以处理nil的切片,所以直接调用切片方法可以不用对nil进行处理
var abc[]string
fmt.Println(len(abc)) //0
abc = append(abc,"aaa")
项len和append都可以正常使用
跟切片一样,如果映射在声明之后没有使用内置的make或者复合字面量进行的初始化,它的值将是nil,映射的许多方法可以处理nil,但是写入方法会异常。
var abc map[string]int
ment, ok:= abc["adb"]
if ok
fmt.Println(ment2)
声明为接口类型的变量在未被赋值时的零值为nil。
var v interface
fmt.Printf("%T %v %v\\n",v,v,v==nil)
如果接口类型的变量被赋值之后,接口就会在内部指向该变量的类型和值。
var p *int
v = p
fmt.Printf("%T %v %v\\n",v,v,v==nil)
你会发现值为nil的变量不等于nil,这是因为接口类型的变量只有类型和值都是nil时才等于nil,所以即使接口变量的值仍然是nil,但只要他的类型不为nil,那么该变量就不等于nil。
为了避免在比较接口变量和nil时得出出乎意料的结果,最好的做法是明确地使用nil标识符,而不是指向一个包含nil的变量。
以上是关于go语言之nil的主要内容,如果未能解决你的问题,请参考以下文章