天天看點

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)