GO-slice父子切片内存共享问题

164 阅读1分钟
s1 := []int{1, 2, 3, 4, 5, 6, 7}  
fmt.Printf("cap %v len %v \n", cap(s1), len(s1))  
  
//子切片  
s2 := s1[0:2]  
fmt.Printf("s2 = %v \n", s2)  
  
//使用copy复制子切片,不共享内存  
s3 := make([]int, 2, 10)  
copy(s3, s1[0:2])  
fmt.Printf("s3 = %v \n", s3)  
  
//子切片s2和s1是共享内存的, s3使用copy复制了slice不会共享内存  
  
//1. 修改子切片s2的元素,s2和s1共享内存, s1也对应发生变更,s3不会发生变更  
s2[0] = 11  
fmt.Printf("s2 = %v \n", s2) //s2 = [11 2]  
fmt.Printf("s1 = %v \n", s1) //s1 = [11 2 3 4 5 6 7]  
fmt.Printf("s3 = %v \n", s3) //s3 = [1 2]  
  
//2. 给子切片s2添加2个元素, s2和s1共享内存, s1也对应发生变更,s3不会发生变更  
s2 = append(s2, 8, 9)  
fmt.Printf("s2 = %v \n", s2) //s2 = [11 2 8 9]  
fmt.Printf("s1 = %v \n", s1) //s1 = [11 2 8 9 5 6 7]  
fmt.Printf("s3 = %v \n", s3) //s3 = [1 2]  
  
//3. 向子切片s2添加9个元素, 因为cap超过了s1的cap,会重新分配内存, s1和s2不再共享内存,因此s1不会发生变更  
s2 = append(s2, 1, 3, 1, 2, 3, 2, 3, 4, 5)  
fmt.Printf("s2 = %v \n", s2) //s2 = [11 2 8 9 1 3 1 2 3 2 3 4 5]  
fmt.Printf("s1 = %v \n", s1) //s1 = [11 2 8 9 5 6 7]