我想将json解码为struct。我的结构看起来像那样:
type message struct {
Request baseRequest `json:"request"` //actually there should be other type here, but I can't think of what it could be
Auth auth `json:"auth"`
}
type baseRequest struct {
Foo string `json:"foo" validate:"required"`
}
type createRequest struct {
baseRequest
Bar string `json:"bar" validate:"required"`
}
type cancelRequest struct{
baseRequest
FooBar string `json:"foo_bar" validate:"required"`
}
我想用createRequest
撰写baseRequest
。我的所有代码都围绕着在责任链模式中传递message
类型。我已经实现了一个处理程序,它创建了一个指向空message
结构的指针,由jsonReader()
函数使用。对于/create
路径,我想使用createRequest
而不是baseRequest
,而对于/cancel
路径,我想使用cancelRequest
。例如在:
func (factory *HandlerFactory) Create() http.Handler {
create := func() *message { return &message{} }
return factory.defaultChain(createNewMessage, nil)
}
我想将message.Request()的类型更改为createRequest
。
并在:
func (factory *HandlerFactory) Cancel() http.Handler {
create := func() *message { return &message{} }
return factory.defaultChain(createNewMessage, nil)
}
我想将message.Request的类型更改为cancelRequest
。我怎样才能在Go中实现类似的东西?
答案 0 :(得分:0)
不幸的是,你想要做的并不是Go的工作原理,因为Go没有多态性 - createRequest和cancelRequest不从baseRequest继承,它们包含一个baseRequest。因此,当你的消息结构中有baseRequest时,它不能是baseRequest之外的任何东西。
您可能需要为每封邮件使用单独的类型。一个用于取消请求,另一个用于创建请求。
以下是an article讨论Go中的继承和组合,并将其与Java进行对比。它应该可以帮助你理解结构嵌入在Go中的工作原理。