golang nil 切片和空切片区别

Golang
399
0
0
2022-05-09

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,指向的引用数组地址是一个固定值。