Go的深浅拷贝
# Go的深浅拷贝
# 浅拷贝(Shallow Copy)
浅拷贝是指复制对象时只复制对象的引用,而不复制对象本身。对于复杂数据结构(如切片、映射等),浅拷贝只复制它们的顶层结构,而不复制它们内部的元素
浅拷贝的例子如下:
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := a
b[0] = 100
fmt.Println("a:", a) // 输出: a: [100 2 3]
fmt.Println("b:", b) // 输出: b: [100 2 3]
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
在这个例子中,b := a 只是复制了切片 a 的引用,因此 b 和 a 指向同一个底层数组。修改 b 中的元素会影响到 a。
# 深拷贝(Deep Copy)
深拷贝是指复制对象时不仅复制对象的引用,还复制对象及其所有子对象(如果有)。这样,深拷贝后的对象是一个完全独立的副本,修改副本不会影响到原始对象。
深拷贝的例子如下(使用copy函数):
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := make([]int, len(a))
copy(b, a)
b[0] = 100
fmt.Println("a:", a) // 输出: a: [1 2 3]
fmt.Println("b:", b) // 输出: b: [100 2 3]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 实现深拷贝的通用方法
对于简单的数据结构,如切片和映射,使用内置的 copy 函数或手动循环复制可以实现深拷贝。但对于复杂的数据结构(如嵌套的切片或映射),需要递归地复制其所有子元素 示例如下:
package main
import "fmt"
// 深拷贝函数,适用于切片嵌套的情况
func deepCopy(src [][]int) [][]int {
dst := make([][]int, len(src))
for i := range src {
dst[i] = make([]int, len(src[i]))
copy(dst[i], src[i])
}
return dst
}
func main() {
a := [][]int{{1, 2}, {3, 4}}
b := deepCopy(a)
b[0][0] = 100
fmt.Println("a:", a) // 输出: a: [[1 2] [3 4]]
fmt.Println("b:", b) // 输出: b: [[100 2] [3 4]]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 总结
- 浅拷贝:仅复制引用,两个对象共享相同的数据
- 深拷贝:复制对象及其所有子对象,两个对象完全独立。
上次更新: 2024/07/08, 18:19:51