Golang中深拷贝与浅拷贝有什么区别

   2024-11-08 9980
核心提示:在Go语言中,深拷贝(deep copy)和浅拷贝(shallow copy)是关于数据复制的两个概念。浅拷贝是指对于一个数据结构,只复制其引

在Go语言中,深拷贝(deep copy)和浅拷贝(shallow copy)是关于数据复制的两个概念。

浅拷贝是指对于一个数据结构,只复制其引用(地址),而不复制其实际内容。这意味着新旧两个数据结构共享同一个底层数据,对其中一个进行修改会影响到另一个。在Go语言中,对于大多数的内置类型(如int、string、slice、map、channel等)的赋值操作都是浅拷贝。

示例代码:

package mainimport "fmt"type Person struct {    Name string    Age  int}func main() {    p1 := Person{Name: "Alice", Age: 30}    p2 := p1 // 浅拷贝    p1.Name = "Bob"    p1.Age = 40    fmt.Println(p1) // 输出: {Bob 40}    fmt.Println(p2) // 输出: {Bob 40}}

上述示例中,p1和p2共享同一个Person对象,因此对p1的修改也会影响到p2。

深拷贝是指对一个数据结构进行逐层复制,复制其所有的内容,包括底层数据和引用的数据。这意味着新旧两个数据结构完全独立,对其中一个进行修改不会影响到另一个。在Go语言中,对于自定义的结构体类型,需要通过一些方式来实现深拷贝,例如使用json.Marshal和json.Unmarshal函数进行序列化和反序列化,或者手动逐层复制每个字段。

示例代码:

package mainimport (    "encoding/json"    "fmt")type Person struct {    Name string    Age  int}func main() {    p1 := Person{Name: "Alice", Age: 30}    p2 := deepCopy(p1) // 深拷贝    p1.Name = "Bob"    p1.Age = 40    fmt.Println(p1) // 输出: {Bob 40}    fmt.Println(p2) // 输出: {Alice 30}}func deepCopy(src Person) Person {    var dst Person    data, _ := json.Marshal(src)    json.Unmarshal(data, &dst)    return dst}

上述示例中,通过使用json.Marshal和json.Unmarshal函数进行序列化和反序列化,实现了对Person对象的深拷贝,确保了p1和p2是完全独立的。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号