天天看点

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)