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

Copying pointer content in go causing uneccesary overhead?

如果我没理解错的话,*s = *(*State)(&state)&state处的内容复制到s地址(在将*rawState转换为*State之后)。但如果是那样的话,只做 s = (*State)(&state) 而不是复制并由 GC 收集 *state 不是更有效吗?或者它会导致副作用改变 s / 的值或其他原因吗?谢谢!

来自 [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

作业:

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

复制指向的值。这是必需的,因为 s 是一个局部变量,一旦函数 returns.

赋值给 s 本身就没有效果

目的是在s指向的地方赋值,这就是上面的赋值语句所做的。

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

查看相关:

s 是一个指针,可以说指向内存中的位置 x

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

调用函数 UnmarshalJSON 时指针指向内存位置 x

如果你这样做:

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

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

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

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

此外,当调用方法时,指针本身(由 UnmarshalJSON 作为 s 接收)是指针在调用位置的副本。 UnmarshalJSON 中的这个 s 是类型 *State 的值,在 UnmarshalJSON 之外不存在。因此,此分配在 UnmarshalJSON.

之外将毫无意义