在 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()}
作业:
*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
.
之外将毫无意义
如果我没理解错的话,*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()}
作业:
*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
.