在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)