【发布时间】:2021-11-25 14:45:39
【问题描述】:
如果我理解正确的话,*s = *(*State)(&state) 将&state 的内容复制到s 地址(在将*rawState 转换为*State 之后)。但是如果是这样的话,只做s = (*State)(&state)而不是复制和*state被GC收集不是更有效吗?或者它是否会导致副作用改变 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()}
【问题讨论】:
-
请注意,解码为
*rawState类型的值而不是*State是必要的,以避免无限递归调用UnmarshalJSON。至少在我看来,代码可以像play.golang.org/p/UlKeqi7MZ-q 这样简化一点(通过抛弃令人困惑的部分)。 -
另外,作者可能只是写了
*s = State(state),结果是一样的。*s = *(*State)(&state)的使用与上述相比没有任何优势,它所做的只是增加了混乱。