大佬教程收集整理的这篇文章主要介绍了指针 – 是dereference golang struct返回struct的新副本?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
package main import ( "fmt" ) type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" fmt.Printf("%p\n",&p.color) return &p } func main() { p := study() fmt.Printf("&p.color = %p\n",&p.color) obj := *p fmt.Printf("&obj.color = %p\n",&obj.color) fmt.Printf("obj = %+v\n",obj) p.color = "purple" fmt.Printf("p.color = %p\n",&p.color) fmt.Printf("p = %+v\n",p) fmt.Printf("obj = %+v\n",obj) obj2 := *p fmt.Printf("obj2 = %+v\n",obj2) }
产量
0x10434120 &p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color! obj = {color:tomato total:0} p.color = 0x10434120 p = &{color:purple total:0} obj = {color:tomato total:0} obj2 = {color:purple total:0} // we get purple Now when dereference again
obj := *p
您正在复制p指向的struct的值(* dereferences p).它类似于:
var obj me = *p
所以obj是我的一个新变量,被初始化为* p的值.这会导致obj具有不同的内存地址.
注意obj if类型为me,而p是* me类型.但它们是不同的价值观.更改obj字段的值不会影响p中该字段的值(除非me结构中的引用类型为字段,即切片,映射或通道.请参阅here和here.).如果你想带来这种效果,请使用:
obj := p // equivalent to: var obj *me = p
现在obj指向与p相同的对象.它们本身仍然具有不同的地址,但在它们内部保持实际me对象的相同地址.
以上是大佬教程为你收集整理的指针 – 是dereference golang struct返回struct的新副本?全部内容,希望文章能够帮你解决指针 – 是dereference golang struct返回struct的新副本?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。