go slice 切片

简记:go的一个切片问题
今天这开发过程中遇到的一个问题,然后展开研究一下,
关于切片的好多属性,我们今天在这就不仔细记录了,有问题可以研究一下大神的文章 :

https://halfrost.com/go_slice/

我们直接上带代码:
我们带着问题研究问题:

情况一:
 // s2 是从s1截取的一部分,,执行 之后,问 s1 的 第一个元素会不会 改变?
 // 为什么?
func Test_2(t *testing.T) {
	s1:=[]int{2,4,6,7}
	s2 := s1[0:3]

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)


 // 执行~~!!
	s2[0] = 99

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)
}

// 这个答案是肯定的,会变,为什么? 因为s2 的内部指针依然指向s1的底层数组
情况二:
// 我们这次 换一下 s1 的类型,换一个定长的切片,问:修改s2 之后,s1 还会变吗 ?
func Test_2(t *testing.T) {
	s1:=[4]int{2,4,6,7}
	s2 := s1[0:3]

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)

	s2[0] = 99

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)
}
// 答案依然是的,会变,因为s2 的底层指针依然是指向s1 的底层数组
情况三:
// 这次我们切换一下,s2的赋值方式,之前是直接截取,我们现在是直接赋值
// 依然,修改s2 之后,s1 会不会改变?
func Test_2(t *testing.T) {
	s1:=[]int{2,4,6,7}
	s2 := s1

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)

	s2[0] = 99
	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)
}
// 答案依然是的,依然会改变,原因可以自己去找找,想想
情况四:
// 依然是问:s2 修改,s1 变不变
// 这次s1是一个定长的切片
func Test_2(t *testing.T) {
	s1:=[4]int{2,4,6,7}
	s2 := s1

	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)

	s2[0] = 99
	fmt.Printf("s1 : %p , %v\n", &s1, s1)
	fmt.Printf("s2 : %p , %v\n", &s2, s2)
}
// 答案是不会的,因为s1是一个定长的切片,s2赋值是,真的复制,并不是指向s1

有大神有更详细的关于切片的解析的文章,可以发我,感激不尽

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值