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