golang nil 切片和空切片区别

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
拉姆塞
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!