golang 不同類型的nil值 golang 不同類型的nil值

golang 不同類型的nil值

nil通道

var ch chan int

通道必須使用make函數進行初始化,對nil管道進行讀寫會導致永久阻塞

nil切片

package main

import "fmt"

func main() {
    var s1 []int
    if s1 == nil {
        fmt.Println("sl is nil")
    }

    var s2 = []int{}
    if s2 != nil {
        fmt.Println("s2 is not nil")
    }

    fmt.Println("nil slice len: ", len(s1))
    for range s1 {

    }

    s1 = append(s1, 1)
}
sl is nil
s2 is not nil
nil slice len:  0

在go語言中空切片和nil在比較時是不一樣的,在遍歷、獲取長度、添加元素時是一樣的

爲什麼要區分空切片和nil切片?

var status *bool

在實際CRUD業務中的修改操作實際上需要提供PUTPATCH兩種接口,即全量修改和增量修改;

比如對於status狀態字段,就會有:修改爲true、修改爲false、不修改三種狀態,如果不使用指針的話是無法區分這三種狀態的(當然也可以通過在批量、全量添加業務代碼強行判斷)

切片也是類似的,常見的區別就是在json序列化時空切片和nil切片是有區別的

nil映射

package main

import "fmt"

func main() {
    var s1 map[int]bool
    if s1 == nil {
        fmt.Println("sl is nil")
    }

    fmt.Println("nil slice len: ", len(s1))
    for range s1 {

    }

    s1[1] = true
}
sl is nil
nil slice len:  0
panic: assignment to entry in nil map

nil切片有所類似,nil映射在獲取長度、遍歷時是一樣的,不需要特殊區分;

但是nil映射,是不能直接賦值的會報錯

爲什麼nil映射不能兼容?

nil切片可以兼容是因爲新創建的切片會通過返回值返回出去,而map是不行的

nil接口

package main

import "fmt"

type myError struct {
}

func (m *myError) Error() string {
    return ""
}

func main() {
    var me *myError
    if me == nil {
        fmt.Println("成功")
    } else {
        fmt.Println("錯誤")
    }

    var e error = me
    if e == nil {
        fmt.Println("成功")
    } else {
        fmt.Println("錯誤")
    }
}
成功
錯誤

nil賦值給某個interface和將某種類型的nil指針賦值給interface是不一樣的,這裏面有兩個原因:

  • 哪怕是nil指針也是可以調用到此類型的方法的
  • nil不包含任何方法在interface底層會使用eface存儲、空指針在interface底層會使用iface存儲、同時會存儲其相關的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章