2016-12-26 104 views
-2

我有一個結構,例如:初始化嵌入式結構當在父初始化沒有控制

type Parent struct { 
    *WithContext 
} 

type WithContext struct { 
    Ctx context.Context 
} 

func (wi *WithContext) SetContext(ctx context.Context) { 
    // nil pointer 
    wi.Ctx = ctx 
} 

父是由一些自動化的過程初始化(如開的解組流),所以無法初始化嵌入式WithContext結構,

有沒有辦法避免'SetContext'func中的nil指針?我試圖重寫指針接收器,但它不會有任何影響,

感謝,

阿薩夫。

+0

請提供更多信息 - 例如一個小型,完整的工作程序來說明問題。如果你說在你的「nil指針」註釋之後你會得到一個無指針的恐慌,那麼你可以通過做「如果wi!= nil {wi.Ctx = ct}」來解決這個問題,但爲什麼你的代碼首先在一個nil對象上調用SetContext? – rog

+0

如果通過反射的某些代碼創建了p:= Parent {},p.SetContext(value)將導致nil,當然,我可以通過'if wi!= nil'避免nil,但是我的問題是是否可以更改指針接收器到新實例的地址。 (例如wi =&WithContext {}) – asaf000

+0

receiver參數就像任何其他參數 - 如果更改它,它會在本地更改值,但不會有任何其他副作用。 – rog

回答

1

理想情況下,無論是構造Parent結構都應該初始化它,以便它處於可用狀態。但是,由於您無法控制它,所以下一個最好的辦法是提供一段代碼,讓您通過在Parent上提供成員函數或僅在應用程序中設置一個代碼來設置WithContext指針,即Parent,自WithContext字段被導出。