在Golang中,深拷贝和浅拷贝是指在复制数据结构时对其内部元素的处理方式。这两者之间的主要区别在于它们如何处理指针、引用类型或对象。
- 浅拷贝: 浅拷贝只复制数据结构的顶层元素。对于值类型(例如int、float、bool等),它们的值会被复制;而对于引用类型(例如指针、切片、映射、通道等),只有引用(即指针)会被复制,实际指向的数据不会被复制。因此,在浅拷贝后,原始数据结构和新数据结构中的引用类型将共享相同的内存空间。
- 深拷贝: 深拷贝会递归地复制数据结构的所有元素,包括指针和引用类型所指向的数据。这意味着,对于引用类型,深拷贝会创建一个新的副本,并将原始数据结构中的数据复制到新副本中。因此,在深拷贝后,原始数据结构和新数据结构将完全独立,互不影响。
下面是例子:
- 浅拷贝: 浅拷贝只复制数据结构的顶层元素。以下是一个浅拷贝示例:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
Pets []string
}
func main() {
original := Person{
Name: "Alice",
Age: 30,
Pets: []string{"Dog", "Cat"},
}
copied := original // 浅拷贝
copied.Name = "Bob"
copied.Pets[0] = "Fish"
fmt.Printf("Original: %+v\n", original)
fmt.Printf("Copied: %+v\n", copied)
}
输出:
Original: {Name:Alice Age:30 Pets:[Fish Cat]}
Copied: {Name:Bob Age:30 Pets:[Fish Cat]}
copiedoriginal
2.深拷贝: 深拷贝会递归地复制数据结构的所有元素,包括指针和引用类型所指向的数据。以下是一个深拷贝示例:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
Pets []string
}
func deepCopy(src Person) Person {
copied := Person{
Name: src.Name,
Age: src.Age,
Pets: make([]string, len(src.Pets)),
}
copy(copied.Pets, src.Pets)
return copied
}
func main() {
original := Person{
Name: "Alice",
Age: 30,
Pets: []string{"Dog", "Cat"},
}
copied := deepCopy(original) // 深拷贝
copied.Name = "Bob"
copied.Pets[0] = "Fish"
fmt.Printf("Original: %+v\n", original)
fmt.Printf("Copied: %+v\n", copied)
}
输出:
Original: {Name:Alice Age:30 Pets:[Dog Cat]}
Copied: {Name:Bob Age:30 Pets:[Fish Cat]}
deepCopyPersoncopiedoriginal