请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

正在回答

2回答

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 回复 有任何疑惑可以回复我~
  • 提问者 qq_何阳光_0 #1
    是的,老师你这个Demo确实是浅拷贝。可是您再 视频中的代码里面,并不是浅拷贝呀。不知道是不是我理解的不对。
    回复 有任何疑惑可以回复我~ 2020-05-18 22:28:32
  • 牛儿吃草 回复 提问者 qq_何阳光_0 #2
    你的截图中的RemoteAddr是string值类型,只有引用类型才会拷贝其地址的。所以你更改RemoteAddr值不会影响outReq.RemoteAddr的。
    
    视频中的确有一处问题是req.Header其实是引用类型,也就是说如果outReq.Header更改内容会影响到req.Header,这里我稍后调整一下。
    回复 有任何疑惑可以回复我~ 2020-05-19 10:42:06
  • 提问者 qq_何阳光_0 回复 牛儿吃草 #3
    嗯嗯,明白了,谢谢老师。我还以为是我理解错了。
    回复 有任何疑惑可以回复我~ 2020-05-19 12:51:26
提问者 qq_何阳光_0 2020-05-18 22:29:13

我把图片放在了这里。

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

0 回复 有任何疑惑可以回复我~

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信