2016-12-26 106 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字段被导出。