关于*outReq = *req 这个是浅拷贝吗?

来源:4-4 开发一个浏览器代理2

qq_何阳光_0

2020-05-17

*outReq = *req 这个是浅拷贝吗?是不是写错了呀。req这个变量已经是*http.Request的指针类型了,outReq使用new方法创建了一个对象也是指针类型了。然后又这样*outReq=*req赋值,肯定是深拷贝呀。。。
图片描述

下面是我写的代码,并附上了结果您看一下,如果是写错了请更改过来。如果我错了,请您告诉我,谢谢。
图片描述

写回答

2回答

牛儿吃草

2020-05-18

package main

import "fmt"

type SubObj struct {
   Name string
}

type ParentObj struct {
   Sub   *SubObj
   PName string
}

func main() {
   pObj := &ParentObj{
      PName: "ParmentObj",
      Sub:   &SubObj{Name: "SubObj"},
   }
   newPObj := &ParentObj{}

   *newPObj = *pObj

   pObj.Sub.Name = "ChangeSubObj"
   fmt.Printf("newPObj: %#v\n", newPObj.Sub.Name)
   fmt.Printf("pObj: %#v\n", pObj.Sub.Name)

   //newPObj: "ChangeSubObj"
   //pObj: "ChangeSubObj"
}

是浅拷贝哦,
浅拷贝对于值类型的话是完全拷贝一份,而对于引用类型是拷贝其地址。

如上面的例子所示,虽然我们对newPObj执行了拷贝,但是其子属性Sub是指针。我们再更改原结构体指针内容时,新结构也会有影响。

0
4
weibo_隱懓_0
*newPObj = *pObj 和 newPObj = pObj 效果一样啊 为啥要先转换成对应的值再赋值呢
2020-11-28
共4条回复

qq_何阳光_0

提问者

2020-05-18

我把图片放在了这里。

//img1.sycdn.imooc.com/szimg/5ec29bb50848217f14240935.jpg

0
0

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程