在go语言中如何基于指针,以操作slice为例,编写程序说明深浅拷贝的区别
简单来说,浅拷贝只是复制指向数据的指针,而不会复制数据本身,而深拷贝则会创建一个全新的数据副本。这意味着在浅拷贝中,原始数据和拷贝数据共享同一个底层数据,而在深拷贝中,两个数据是完全独立的。
在 Go 语言中,可以通过指针来实现深拷贝和浅拷贝。下面是一个以操作 slice 为例的程序,用于演示深拷贝和浅拷贝的区别:
package main
import "fmt"
func main() {
// 原始 slice
original := []int{1, 2, 3, 4, 5}
// 浅拷贝
shallowCopy := original
// 修改拷贝数据
shallowCopy[0] = 10
// 输出结果
fmt.Println("Original:", original)
fmt.Println("Shallow copy:", shallowCopy)
// 深拷贝
deepCopy := make([]int, len(original))
copy(deepCopy, original)
// 修改拷贝数据
deepCopy[1] = 20
// 输出结果
fmt.Println("Original:", original)
fmt.Println("Deep copy:", deepCopy)
}
在上面的程序中,我们首先创建了一个名为 original 的 slice,其中包含了五个整数。然后我们进行了浅拷贝和深拷贝操作,分别得到了 shallowCopy 和 deepCopy 这两个新的 slice。
接下来,我们修改了 shallowCopy 和 deepCopy 中的数据,分别将第一个和第二个元素的值修改为了不同的值。然后我们分别输出了原始 slice 和两个拷贝的 slice 的内容。
通过运行上面的程序,我们可以看到以下输出:
Original: [10 2 3 4 5]
Shallow copy: [10 2 3 4 5]
Original: [10 2 3 4 5]
Deep copy: [1 20 3 4 5]
可以看到,修改了浅拷贝的数据之后,原始 slice 的内容也被修改了。这是因为浅拷贝只是复制了指向底层数据的指针,两个 slice 共享同一个底层数据。
而对于深拷贝,由于创建了一个全新的数据副本,因此在修改 deepCopy 中的数据之后,原始 slice 的内容并没有被修改。
需要注意的是,在 Go 语言中,不同的数据类型可能会有不同的拷贝方式,因此在编写代码时需要仔细考虑使用哪种拷贝方式。同时,需要注意在对拷
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6] // 2, 3, 4, 5
//s2 := s1[3:5] //5, 6
s2 := s1[0:2] //2, 3
s2 = append(s2, 10)
// s2 的值 5,6, 10
// s2 的值 2 ,3,10
// arr 的值 0, 1, 2, 3,4, 5, 6, 10
// arr 的值为 0, 1, 2, 3,10,5, 6, 7
添加元素时,如果超越cap,系统会重新分配更大的底层数组
由于值传递的关系,必须接收append的返回值
s = append(s ,val)