为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中复制指针内容会导致不必要的开销?

在 Go 中复制指针内容会导致不必要的开销?

Go
慕哥6287543 2022-10-04 19:08:00
如果我理解正确,请将内容复制到 s 地址(投射到 )。但是,如果是这样的话,那么仅仅做而不是复制和被GC收集不是更有效吗?或者它可能导致副作用改变s的值/或其他原因这样做?谢谢!*s = *(*State)(&state)&state*rawState*States = (*State)(&state)*state[0]的完整函数:func (s *State) UnmarshalJSON(b []byte) error {type rawState Statevar state rawStatedec := json.NewDecoder(bytes.NewReader(b))if s.useJSONNumber {    dec.UseNumber()}err := dec.Decode(&state)if err != nil {    return err}*s = *(*State)(&state)return s.Validate()}[0]https://github.com/hashicorp/terraform-json/blob/d1018bf93fd9c097133b0159ab8b3c0517a846c9/state.go#L73
查看完整描述

2 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

作业:

*s = *(*State)(&state)

复制指向的值。这是必需的,因为它是一个局部变量,一旦函数返回,将任何内容分配给自身将不起作用。ss

其目的是将某些内容分配到指向的位置,这就是上述赋值语句所做的。s

使用的目标是创建一个没有该方法的新类型,因此传递给不会导致堆栈溢出。rawStateUnmarshalJSON()*rawStatejson.Unmarshal()

请参阅相关内容:调用 json。取消消息在未使用JSON函数内部的取消消息,而不会导致堆栈溢出


查看完整回答
反对 回复 2022-10-04
?
智慧大石

TA贡献1946条经验 获得超3个赞

s是一个指针,让我们说指向内存中的位置。x

&state是位于内存位置 的另一个指针。y

调用该函数时,指针指向内存位置 。UnmarshalJSONx

如果您这样做:

*s = *(*State)(&state)

这意味着:将指针指向 (),将其转换为正确的指针类型(),然后转到内存位置(后面的开头的 *),然后将 value() 复制到另一个内存位置 ()。y&state*Statey==x*s

另一方面,如果您这样做:s = (*State)(&state)

这意味着:将指针指向 (),将其转换为正确的指针类型 (),将指针 () 复制到接收器 ()。任何称为此函数的内存位置都保持不变。y&state*State=sx

此外,当方法被调用指针本身时,由 as 接收的是指针在调用它的位置的副本。此内部是类型值,该值不存在于 之外。因此,此分配在 之外将毫无意义。UnmarshalJSONssUnmarshalJSON*StateUnmarshalJSONUnmarshalJSON


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号