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
業務中的修改操作實際上需要提供PUT
、PATCH
兩種接口,即全量修改和增量修改;
比如對於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
存儲、同時會存儲其相關的方法