如何在mgo(Go)中将接口类型用作模型?

碎片:

假设您的工作流由多个不同类型的嵌入式节点组成。由于节点是不同类型的,因此我想到在这里使用Golang接口,并提出以下内容:

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []Node
}

type Node interface {
  Exec() (int, error)
}

type EmailNode struct {
   From string
   To string
   Subject string
   Body string
}

type TwitterNode struct {
   Tweet string
   Image []byte
}

func (n *EmailNode) Exec() (int, error){
   //send email
   return 0, nil
}

func (n *TwitterNode) Exec() (int, error) {
   //send tweet
   return 0, nil
}

这些工作流存储在MongoDB中,并且我有示例种子数据。当我尝试查找工作流程(使用其ID)时,使用mgo:

w = &Workflow{}
collection.FindID(bson.ObjectIdHex(id)).One(w)

我收到错误-bson.M类型的值不可分配给Node类型。

对于我来说,如何在没有任何类型信息的情况下如何将嵌入式Node文档解组到Go结构中也让我感到有些奇怪。可能我需要从另一个角度看问题。

任何建议将不胜感激。

西蒙·福克斯(Simon Fox):

由于您提到的原因,您不能在文档中使用界面。解码器没有有关要创建的类型的信息。

一种解决方法是定义一个结构来保存类型信息:

type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}

在此类型上实现SetBSON函数。此函数应解码类型字符串,根据该字符串创建正确类型的值,然后解组为该值。

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Go中引用接口类型?

如何在Java中将接口用作列表或数组类型?

如何在ormlite中将enum const持久化为接口类型?

如何在python中创建此特定的接口类型?

Go中接口类型的间接

如何在Delphi 10.2中将接口方法用作方法类型的参数

如何在vb.net中将类型为“ System .__ ComObject”的COM对象转换为接口类型为“ ESRI.ArcGIS.Carto.FeatureLayer”?

如果接口类型的变量是实现它的特定结构类型,如何检查 Go?

如何在Java中使用接受扩展接口类型的参数的函数来创建接口?

如何在该接口类型的对象上调用实现接口的类中的方法?

如何访问嵌套接口类型

CLR如何加载接口类型?

如何创建接口类型数组

如何定义一个通用包装器接口类型并将其用作Java中的方法返回类型?

如何在结构字段上使用类型切换(当字段属于接口类型时)?

ASP.NET MVC在操作过滤器中将视图模型转换为通用接口类型

接口类型的变量

接口类型推断

接口类型返回

接口类型推断

如何在接口类型的引用上调用Object类的方法?

如何在KVM上为Windows 8.1 guest虚拟机更改磁盘接口类型

如何在Django模型中将用户用作ForeignKey

如何在Django模型中将枚举用作选择字段

如何确定类型是否实现特定的通用接口类型

如何在Go中将地图用作数据载体?

如何在Julia中将向量用作类型参数

如何在plpgsql中将变量用作字段类型?

如何在Swift中将UIColor用作枚举类型的RawValue