如果我理解正確,*s = *(*State)(&state)請將 at 的內容復制&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()}
[0] https://github.com/hashicorp/terraform-json/blob/d1018bf93fd9c097133b0159ab8b3c0517a846c9/state.go#L73
uj5u.com熱心網友回復:
那作業:
*s = *(*State)(&state)
是否復制指向的值。這是必需的,因為它s是一個區域變數,s一旦函式回傳,將任何內容分配給它自己都將無效。
目的是分配 wheres指向的東西,這就是上面的賦值陳述句所做的。
using 的目標rawState是創建一個沒有UnmarshalJSON()方法的新型別,因此傳遞*rawState給json.Unmarshal()不會導致堆疊溢位。
請參閱相關:在 UnmarshalJSON 函式中呼叫 json.Unmarshal 不會導致堆疊溢位
uj5u.com熱心網友回復:
s是一個指標,可以說指向x記憶體中的位置。
&state是另一個指向記憶體位置的指標y。
UnmarshalJSON使用指向記憶體位置的指標呼叫該函式x。
如果你這樣做:
*s = *(*State)(&state)
這就是說,指標,以y(&state),將其轉換為正確的指標型別(*State),然后到存盤位置y(*在開始后=),然后復制值(=),這個其他存盤位置x(*s)。
另一方面,如果您執行以下操作: s = (*State)(&state)
這就是說,指標到y(&state),將其轉換為正確的指標型別(*State),復制該指標(=)到接收器(s)。x呼叫此函式的任何物件指向的記憶體位置保持不變。
此外,當該方法被呼叫時,由UnmarshalJSONas接收的指標本身s是在它被呼叫的位置處的指標的副本。這s里面UnmarshalJSON是一個*State超出UnmarshalJSON. 因此,此分配將在 之外毫無意義UnmarshalJSON。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315009.html
上一篇:接收陣列作為指標引數的問題
