如何定义将包含许多其他不同类型的泛型类型 [英] How to define a generic types that will hold many other diferent types

查看:0
本文介绍了如何定义将包含许多其他不同类型的泛型类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题的一些上下文:

我们正在使用Golang在AWS中创建一个lambda函数,在此函数中,我们需要使用GraphQL从数据库中检索一些信息。

我们能够这样做,但当前在将响应分析为有效类型时遇到一些问题,因为我们希望使用单个类型来保存所有可能的方案。

要更好地解释这一点,请查看";示例,然后查看";目标";。

示例:

我们将收到如下内容:

{
  "data": {
    "getUser": {
      "id": "example1",
      "name": "example_name"
    }
  }
}

像这样(还有更多):

{
  "data": {
    "getEvent": {
        "id": "event1",
        "name": "example_name"
      }
    }
  }
}

目标:

因此,我们要创建的是一个表示数据字段的类型,并且它还可以有多个表示形式,如下所示:

type Response {
  Data <???> `json:"data"`
}

其中的类型可以是同一类型的getUser和(以及更多不同的类型):

type GetPerson {
  Id string `json:"id"`
  Name string `json:"name"`
}

type GetEvent {
  Id string `json:"id"`
  Name string `json:"name"`
}

附注:我们愿意听取不同的建议,以便更好地处理此问题,如果需要,我们还可以添加更多信息。

推荐答案

您可以使用胖界面

type Data struct {
   Person *GetPerson `json:"user"`
   Event *GetEvent `json:"event"`
   ...
}

然后,解组Data的实例,查看包含的元素中哪一个不为空,并使用该元素。

您还可以实现多态接口。以下是这个想法的概要:

type Data struct {
  Item interface{}
}

type dataMarshal struct {
   Item map[string]json.RawMessage
}

// Map JSON keys to factory functions
var factory:=map[string]func()interface{} {
   "user": func() interface{} { return &GetUser{} },
   "event": func() interface{} {return &GetEvent{} },
}

func (d *Data) UnmarshalJSON(in []byte) error {
  var data dataMarshal
  // Unmarshal data with key and raw message
  err:=json.Unmarshal(in,&data)
  for k,v:=range data.Item {
     // Based on the key, create a new object
     obj:=factory[k]()
      // Unmarshal new object
     err:=json.Unmarshal(v,obj)
     d.Item=obj
  }
  return nil
}

这篇关于如何定义将包含许多其他不同类型的泛型类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆