go slice 切片

88 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

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

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

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