我正在尝试找到最好的方法来解决这个问题,我通常会用另一种语言的继承来解决这个问题,但很难找到解决问题的方法。
我有许多结构,它们都共享一个公共的嵌入结构。我想对这些结构使用通用的“方法”,并允许它们更新嵌入结构的成员。
type EventMetaData struct {
SystemId string `json:"system_id"`
Timestamp string `json:"timestamp"`
}
func (evd *EventMetaData) SetSystemId(systemId string) {
evd.SystemId = systemId
}
type LoginEvent struct {
*EventMetaData
UserId string `json:"user_id"`
Method string `json:"method"`
Timestamp string `json:"timestamp"`
}
type LogoutEvent struct {
*EventMetaData
UserId string `json:"user_id"`
}
type CanSetEventMetaData interface {
SetSystemId(string)
}
func FromPayload(ev *CanSetEventMetaData, payload []byte) (*E, error) {
err := json.Unmarshal(payload, ev)
if err != nil {
return nil, err
}
ev.SetSystemId(config.systemId)
return ev, nil
}
但是,ev.SetSystemId 行返回未解析的引用。
在我使用过的其他语言中,我会使用 SetSystemId 方法继承基类。我明白这不是正确的方法。
你所做的是正确的,但是,参数
ev
是一个指向接口的指针,它不是一个接口。修复:
func FromPayload(ev CanSetEventMetaData, payload []byte) (*E, error) {
...
}