加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

指针 – 是dereference golang struct返回struct的新副本?

发布时间:2020-12-16 19:23:03 所属栏目:大数据 来源:网络整理
导读:为什么当我们使用(* structObj)引用struct时,golang似乎返回structObj的新副本而不是返回原始structObj的相同地址?可能会对此产生一些误解,所以要求善意澄清 package mainimport ( "fmt")type me struct { color string total int}func study() *me { p :=
为什么当我们使用(* structObj)引用struct时,golang似乎返回structObj的新副本而不是返回原始structObj的相同地址?可能会对此产生一些误解,所以要求善意澄清
package main

import (
    "fmt"
)

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    fmt.Printf("%pn",&p.color)
    return &p
}

func main() {


    p := study()
    fmt.Printf("&p.color = %pn",&p.color)

    obj := *p
    fmt.Printf("&obj.color = %pn",&obj.color)
    fmt.Printf("obj = %+vn",obj)

    p.color = "purple"
    fmt.Printf("p.color = %pn",&p.color)
    fmt.Printf("p = %+vn",p)
    fmt.Printf("obj  = %+vn",obj)

    obj2 := *p
    fmt.Printf("obj2 = %+vn",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

golang playground

当你写作
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对象的相同地址.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读