采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
*outReq = *req 这个是浅拷贝吗?是不是写错了呀。req这个变量已经是*http.Request的指针类型了,outReq使用new方法创建了一个对象也是指针类型了。然后又这样*outReq=*req赋值,肯定是深拷贝呀。。。
下面是我写的代码,并附上了结果您看一下,如果是写错了请更改过来。如果我错了,请您告诉我,谢谢。
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是指针。我们再更改原结构体指针内容时,新结构也会有影响。
是的,老师你这个Demo确实是浅拷贝。可是您再 视频中的代码里面,并不是浅拷贝呀。不知道是不是我理解的不对。
你的截图中的RemoteAddr是string值类型,只有引用类型才会拷贝其地址的。所以你更改RemoteAddr值不会影响outReq.RemoteAddr的。 视频中的确有一处问题是req.Header其实是引用类型,也就是说如果outReq.Header更改内容会影响到req.Header,这里我稍后调整一下。
嗯嗯,明白了,谢谢老师。我还以为是我理解错了。
我把图片放在了这里。
登录后可查看更多问答,登录/注册
简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关
1.4k 23
1.5k 9
989 8
1.4k 8
925 7