如何将动态类型化数据写入结构中的字段

时间:2017-12-14 22:37:45

标签: go interface

我有以下响应结构,我想用它作为基本包装器来响应用户发送给我的API调用。

type Response struct {
  Data      ???                     `json:"data,omitempty"`
  Time      int64                   `json:"time,omitempty"`
  Message   string                  `json:"message,omitempty"`
}

数据字段的类型各不相同,可能是map[string]*CustomStruct1 map[string*CustomStruct2[]CustomStruct3

攻击此类问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

一种选择是简单地将“数据”视为interface{}(任意)类型,而不是使用自定义结构,并根据对实际取消编组的内容的检查来处理结果值。当然,一旦你检查了数据以确定它应该是什么类型,你可以在事后将其转换为适当的强类型。

type Response struct {
  Data      interface{} `json:"data,omitempty"`
  Time      int64       `json:"time,omitempty"`
  Message   string      `json:"message,omitempty"`
}

另一种选择是将“Response”结构嵌入到专门的结构中,这些结构会查找您的自定义类型并解组为适当的类型,假设您知道您提前获得了哪一个:

type BaseResponse struct {
  Time      int64  `json:"time,omitempty"`
  Message   string `json:"message,omitempty"`
}

type Response1 struct {
  BaseResponse
  Data map[string]*CustomStruct1 `json:"data"`
}

type Response2 struct {
  BaseResponse
  Data map[string]*CustomStruct2 `json:"data"`
}

// etc...

最终,unmarshaler无法根据取消编组的文档选择变量类型,它只会将JSON值反序列化为由您明确定义的结构或通用定义的结构。

答案 1 :(得分:0)

你可以尝试使用反射,但它不会非常惯用。