Json解码为struct,使用不同的请求类型,具体取决于路径

时间:2018-02-26 16:43:16

标签: go

我想将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中实现类似的东西?

1 个答案:

答案 0 :(得分:0)

不幸的是,你想要做的并不是Go的工作原理,因为Go没有多态性 - createRequest和cancelRequest不从baseRequest继承,它们包含一个baseRequest。因此,当你的消息结构中有baseRequest时,它不能是baseRequest之外的任何东西。

您可能需要为每封邮件使用单独的类型。一个用于取消请求,另一个用于创建请求。

以下是an article讨论Go中的继承和组合,并将其与Java进行对比。它应该可以帮助你理解结构嵌入在Go中的工作原理。