猿问

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

如果我理解正确,请将内容复制到 s 地址(投射到 )。但是,如果是这样的话,那么仅仅做而不是复制和被GC收集不是更有效吗?或者它可能导致副作用改变s的值/或其他原因这样做?谢谢!*s = *(*State)(&state)&state*rawState*States = (*State)(&state)*state


[0]的完整函数:


func (s *State) UnmarshalJSON(b []byte) error {

type rawState State

var state rawState


dec := 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



慕哥6287543
浏览 119回答 2
2回答

摇曳的蔷薇

作业:*s = *(*State)(&state)复制指向的值。这是必需的,因为它是一个局部变量,一旦函数返回,将任何内容分配给自身将不起作用。ss其目的是将某些内容分配到指向的位置,这就是上述赋值语句所做的。s使用的目标是创建一个没有该方法的新类型,因此传递给不会导致堆栈溢出。rawStateUnmarshalJSON()*rawStatejson.Unmarshal()请参阅相关内容:调用 json。取消消息在未使用JSON函数内部的取消消息,而不会导致堆栈溢出

智慧大石

s是一个指针,让我们说指向内存中的位置。x&state是位于内存位置 的另一个指针。y调用该函数时,指针指向内存位置 。UnmarshalJSONx如果您这样做:*s = *(*State)(&state)这意味着:将指针指向 (),将其转换为正确的指针类型(),然后转到内存位置(后面的开头的 *),然后将 value() 复制到另一个内存位置 ()。y&state*Statey==x*s另一方面,如果您这样做:s = (*State)(&state)这意味着:将指针指向 (),将其转换为正确的指针类型 (),将指针 () 复制到接收器 ()。任何称为此函数的内存位置都保持不变。y&state*State=sx此外,当方法被调用指针本身时,由 as 接收的是指针在调用它的位置的副本。此内部是类型值,该值不存在于 之外。因此,此分配在 之外将毫无意义。UnmarshalJSONssUnmarshalJSON*StateUnmarshalJSONUnmarshalJSON
随时随地看视频慕课网APP

相关分类

Go
我要回答