本文已参加「新人创作礼」活动,一起开启掘金创作之路。
简记: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
有大神有更详细的关于切片的解析的文章,可以发我,感激不尽