登录
首页 >  Golang >  Go问答

定义一个适用于多种不同类型泛型的容器

来源:stackoverflow

时间:2024-02-13 23:54:24 341浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《定义一个适用于多种不同类型泛型的容器》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

问题的一些背景:

我们正在使用 golang 在 aws 中创建一个 lambda 函数,在这个函数中我们需要使用 graphql 从数据库中检索一些信息。

我们能够做到这一点,但目前在将响应解析为有效类型时遇到一些问题,因为我们希望使用单一类型来容纳所有可能的场景。

为了更好地解释这一点,请查看“示例”,然后查看“目标”。

示例:

我们将收到如下内容:

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

像这样(以及更多):

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

目标:

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

type response {
  data  `json:"data"`
}

其中的类型可以是同一类型的“getuser”和“getevent”(以及更多不同的类型):

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

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

p.s:我们愿意接受不同的建议,以更好地解决此问题,如果需要,我们还可以添加更多信息。


正确答案


您可以使用胖接口

type data struct {
   person *getperson `json:"user"`
   event *getevent `json:"event"`
   ...
}

然后,解组 data 的一个实例,查看其中包含的哪个元素不为 nil,然后使用它。

您还可以实现多态接口。下面是这个想法的草图:

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
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《定义一个适用于多种不同类型泛型的容器》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>