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