golang nil 切片和空切片区别?
var slice1 []int //nil 切片
slice2 := []int{} //空切片
slice3 := make(int[],0) //空切片
首先来看下切片底层数据结构:
type SliceHeader struct {
Data uintptr //指向的引用数组地址
Len int //切片长度
Cap int //切片容量
}
不难理解: nil切片和空切片是Len 和 Cap都是 0。
关键看nil切片和空切片的Data(即指向的引用数组地址)的区别,不妨将他们的值打印出来,看到底有什么区别?
func main(){
var slice1 []int //nil 切片
var slice2 []int //nil 切片
slice3 := []int{} //空切片
slice4 := make([]int,0) //空切片
fmt.Printf("slice1 Data:%+v, slice2 Data:%+v, slice3 Data:%+v, slice4 Data:%+v,\n", *(*reflect.SliceHeader)(unsafe.Pointer(&slice1)),*(*reflect.SliceHeader)(unsafe.Pointer(&slice2)),*(*reflect.SliceHeader)(unsafe.Pointer(&slice3)),*(*reflect.SliceHeader)(unsafe.Pointer(&slice4)))
}
输出结果:
slice1 Data:{Data:0 Len:0 Cap:0}, slice2 Data:{Data:0 Len:0 Cap:0}, slice3 Data:{Data:824634158760 Len:0 Cap:0}, slice4 Data:{Data:824634158760 Len:0 Cap:0}
由此可见:
1.nil切片Data值为0(指向的引用数组地址为0,可以理解是一个无效地址)
2.空切片Data值为824634158760,指向的引用数组地址是一个固定值。