117.info
人生若只如初见

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

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

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

示例代码:

package main

import "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 main

import (
    "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是完全独立的。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe65fAzsLAQBUAFY.html

推荐文章

  • golang异步处理日志怎么实现

    在Go中,可以使用goroutine和channel来实现异步处理日志。下面是一个简单的示例:
    package main import ( "log" "os" "time"
    ) func main() { // 创建...

  • golang的copyCheck.check如何检测对象复制

    在Go语言中,要检测对象复制是否发生,可以使用reflect包中的DeepEqual函数来比较两个对象是否相同。以下是一个简单的示例代码:
    package main import ( "f...

  • golang守护进程实现的方法是什么

    在Golang中,可以使用以下方法实现守护进程: 使用os/exec包中的Start方法启动一个新进程,并在父进程中退出: package main import ( "log" "os" "os/exec" "sy...

  • golang单例模式实现的方法是什么

    在Go语言中,可以通过如下方法实现单例模式: 基于sync.Once实现的单例模式: package singleton import "sync" type singleton struct{} var instance *singlet...

  • mysql中skip-grant-tables的作用是什么

    在MySQL中,skip-grant-tables是一个配置选项,用于启动MySQL服务器时跳过授权表的验证,以便能够以特权用户的身份登录,并修改或重置其他用户的密码。这个选项主...

  • linux cpu信息修改的方法是什么

    要修改Linux操作系统中的CPU信息,可以通过以下方法之一: 使用“cpufrequtils”工具:这是一个专门用于调整CPU频率和电源管理的工具。可以使用以下命令安装:

  • R语言中怎么绘制表格

    在R语言中,可以使用table函数创建表格对象,然后使用print函数打印表格。
    以下是一个示例:
    # 创建表格对象
    table_data

  • oracle中rowid的使用方法是什么

    在Oracle中,ROWID是一个特殊的伪列,它唯一标识数据库表中的一行数据。ROWID可以用于快速查找、更新和删除特定的行。
    以下是在Oracle中使用ROWID的几种常见...