采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
*outReq = *req 这个是浅拷贝吗?是不是写错了呀。req这个变量已经是*http.Request的指针类型了,outReq使用new方法创建了一个对象也是指针类型了。然后又这样*outReq=*req赋值,肯定是深拷贝呀。。。
下面是我写的代码,并附上了结果您看一下,如果是写错了请更改过来。如果我错了,请您告诉我,谢谢。
package main
import
"fmt"
type
SubObj struct {
Name string
}
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)
"pObj: %#v\n"
, pObj.Sub.Name)
//newPObj
:
//pObj
是浅拷贝哦,浅拷贝对于值类型的话是完全拷贝一份,而对于引用类型是拷贝其地址。
如上面的例子所示,虽然我们对newPObj执行了拷贝,但是其子属性Sub是指针。我们再更改原结构体指针内容时,新结构也会有影响。
是的,老师你这个Demo确实是浅拷贝。可是您再 视频中的代码里面,并不是浅拷贝呀。不知道是不是我理解的不对。
你的截图中的RemoteAddr是string值类型,只有引用类型才会拷贝其地址的。所以你更改RemoteAddr值不会影响outReq.RemoteAddr的。 视频中的确有一处问题是req.Header其实是引用类型,也就是说如果outReq.Header更改内容会影响到req.Header,这里我稍后调整一下。
嗯嗯,明白了,谢谢老师。我还以为是我理解错了。
我把图片放在了这里。
登录后可查看更多问答,登录/注册
简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关
1.6k 23
1.6k 9
1.1k 8
1.5k 8
1.0k 7
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号