go 深/浅拷贝结构体对象

Posted big_cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 深/浅拷贝结构体对象相关的知识,希望对你有一定的参考价值。

go 中,当我们以 new& 的方式,创建一个 struct 的对象实例后(指针),如果直接使用赋值运算符,则像其他语言一样,会浅拷贝到一个新对象,二者指向的内存地址是相同的。go 并没有类似 clone 这种 深拷贝 操作 关键字,那如何简单快速的 深拷贝 一个 对象

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name string
    Age  uint8
}

func main() {
    // 深拷贝 将 stud1 对象 深拷贝出一个 stud2
    // stud1 和 stud2 指向了两块内存地址 副本
    stud1 := &Student{Name: "sqrtCat", Age: 35}
    // 为 tmp 分配新的内存地址
    tmp := *stud1
    // 将 tmp 的内存地址赋给指针变量 stud2
    stud2 := &tmp
    stud2.Name = "bigCat"
    fmt.Printf("%+v\\n%+v\\n", stud1, stud2)
    
    // 浅拷贝
    stud3 := &Student{Name: "sqrtCat", Age: 35}
    stud4 := stud3
    stud4.Name = "bigCat"
    fmt.Printf("%+v\\n%+v\\n", stud3, stud4)
}

还有个指针和变量的小例子可以参阅

package main

import (
    "fmt"
)

type HelloService struct {}

func (p *HelloService) Hello(request string, reply *string) error {
    // reply 是指针
    // *reply 是指针指向的变量
    *reply = "hello:" + request
    return nil
}

func main() {
    var reply1 *string//变量声明
    reply1 = new(string)//空指针 初始化掉
    
    reply2 := new(string)//声明+初始化
    
    hs := new(HelloService)
    hs.Hello("sqrtcat", reply1)
    hs.Hello("bigcat", reply2)
    fmt.Printf("%v\\n%v\\n", *reply1, *reply2)
}

以上是关于go 深/浅拷贝结构体对象的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体 ( 结构体浅拷贝 )

C++入门深拷贝和浅拷贝详解

C++入门深拷贝和浅拷贝详解

C 语言结构体成员赋值的深拷贝和浅拷贝

深拷贝_浅拷贝

#yyds干货盘点#愚公系列2022年08月 Go教学课程 027-深拷贝和浅拷贝