go 深/浅拷贝结构体对象

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

package mainimport ( "encoding/json" "fmt" )type Student struct { Name string Ageuint8 }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) }

【go 深/浅拷贝结构体对象】还有个指针和变量的小例子可以参阅
package mainimport ( "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) }

    推荐阅读