golang nil 切片和空切片區別

ramsey發表於2021-07-03

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 協議》,轉載必須註明作者和本文連結
拉姆塞

相關文章