1. nil 切片和空切片的区别

nil 切片和空切片都有什么不同呢,通过下边代码了解一下:

package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func TestSlice() {
	// nil 切片初始化方式
	var s1 []int
	// 空切片初始化方式
	s2, s3 := make([]int, 0), make([]int, 0)
	fmt.Printf("s1=%+v,s2=%+v,s3=%+v \n", s1, s2, s3)
	fmt.Printf("s1=%p,s2=%p,s3=%p \n", &s1, &s2, &s3)
	fmt.Printf("s1==nil?%v\n", s1 == nil)
	fmt.Printf("s2==nil?%v\n", s2 == nil)
	// 输出切片底层数据结构
	fmt.Printf("s1 pointer:%+v, s2 pointer:%+v, s4 pointer:%+v, \n", *(*reflect.SliceHeader)(unsafe.Pointer(&s1)), *(*reflect.SliceHeader)(unsafe.Pointer(&s2)), *(*reflect.SliceHeader)(unsafe.Pointer(&s3)))
	fmt.Printf("s1 pointer:%+v, s2 pointer:%+v, s4 pointer:%+v, \n", (*reflect.SliceHeader)(unsafe.Pointer(&s1)), (*reflect.SliceHeader)(unsafe.Pointer(&s2)), (*reflect.SliceHeader)(unsafe.Pointer(&s3)))
	// 输出切片底层 data 的地址(引用数组指针地址)
	fmt.Printf("&s1.data == &s2.data ?%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s1))).Data == (*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data)
	fmt.Printf("&s2.data == &s3.data ?%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data == (*(*reflect.SliceHeader)(unsafe.Pointer(&s3))).Data)
}

func main() {
	TestSlice()
}

输出:

s1=[],s2=[],s3=[] 
s1=0xc000118000,s2=0xc000118018,s3=0xc000118030 
s1==nil?true
s2==nil?false
s1 pointer:{Data:0 Len:0 Cap:0}, s2 pointer:{Data:18412560 Len:0 Cap:0}, s4 pointer:{Data:18412560 Len:0 Cap:0}, 
s1 pointer:&{Data:0 Len:0 Cap:0}, s2 pointer:&{Data:18412560 Len:0 Cap:0}, s4 pointer:&{Data:18412560 Len:0 Cap:0}, 
&s1.data == &s2.data ?false
&s2.data == &s3.data ?true

得到结论:
nil 切片和空切片指向的地址不一样。 nil空切片引用数组指针地址为0(无指向任何实际地址);空切片的引用数组指针地址是有的,且固定为一个值

// slice 底层数据结构
type SliceHeader struct {
 Data uintptr  //引用数组指针地址
 Len  int     // 切片的目前使用长度
 Cap  int     // 切片的容量
}

nil切片和空切片最大的区别在于指向的数组引用地址是不一样的。

例如:
s1 pointer:&{Data:0 Len:0 Cap:0}, s2 pointer:&{Data:18412560 Len:0 Cap:0}, s4 pointer:&{Data:18412560 Len:0 Cap:0}, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值