空切片和nil切片的区别
主要的区别是,切片的数据结构里的DATA
指针地址,空切片的Data
指针地址有具体值,而nil的Data
的值为0, 而且空切片的地址是一样的
type SliceHeader struct {
Data uintptr //指针地址
Len int // 使用长度
Cap int // 切片的容量
}
var a []int //直接申明的切片就为nil切片
var b = make([]int, 0) //make初始化之后就是empty切片
var c = make([]int, 0)
fmt.Println(*(*reflect.SliceHeader)(unsafe.Pointer(&a)))
fmt.Println(*(*reflect.SliceHeader)(unsafe.Pointer(&b)))
fmt.Println(*(*reflect.SliceHeader)(unsafe.Pointer(&c)))
也有没有make的不是nil的
var s []int // len(s) == 0, s == nil
if s == nil {
fmt.Println("s 为nil")
}
s = nil // len(s) == 0, s == nil
if s == nil {
fmt.Println("s 为nil")
}
s = []int(nil) // len(s) == 0, s == nil
if s == nil {
fmt.Println("s 为nil")
}
s = []int{} // len(s) == 0, s != nil
if s != nil {
fmt.Println("s不b为nil")
}
所以判断一个切片是否为空,最后用len(a)
,而不是用nil