go - 如何在 Go 中对这些类型建模

标签 go

我有多种这样的类型:

type QueryMessage struct {
    Header MessageHeader
    Type   MessageType
    Query  SqlQuery
}

type UpdateMessage struct {
    Header  MessageHeader
    Type    MessageType
    OldData map[string]interface{}
    NewData map[string]interface{}
}

type InsertMessage struct {
    Header MessageHeader
    Type   MessageType
    Data   map[string]interface{}
}

它们都有两个共同的属性,HeaderType。最后,我需要将它们聚合成一组通用消息。 目前我的Message界面是这样的:

type Message interface {}

所以我基本上做的是这样的事情(将它们全部转换到 Message 接口(interface)):

q := QueryMessage{ ... }
u := UpdateMessage{ ... }
i := InsertMessage{ ... }
allMessages := [3]Message { Message(q), Message(u), Message(i), }

这有效,但它丢失了所有类型信息,我希望仍然能够从 Message 中公开 HeaderType类型(以便客户端代码理论上可以将基于 TypeMessage 转换回其原始类型。

如何做到这一点?我想不出一个合适的方法,接口(interface)不能有属性,如果我把 Message 做成一个结构,Go 不允许我转换 e。 G。 QueryMessageMessage 了。

最佳答案

您的界面可以提供访问器:

type Message interface {
   GetHeader() MessageHeader
   GetType() MessageType
}

然后您必须在所有类型上实现此接口(interface)。

为了分解出公共(public)部分,您可以使用额外的基类型,并将其嵌入到您的其他结构中:

// the interface :
type Message interface {
    GetHeader() MessageHeader
    GetType() MessageType
}

// a base struct type, which holds 2 fields and implements the Message interface :
type baseMessage struct {
    Header MessageHeader
    Type   MessageType
}

func (b *baseMessage) GetHeader() MessageHeader {
    return b.Header
}

func (b *baseMessage) GetType() MessageType {
    return b.Type
}

// your three types, with an embedded "baseMessage" part :
type QueryMessage struct {
    baseMessage
    Query SqlQuery
}

type UpdateMessage struct {
    baseMessage
    OldData map[string]interface{}
    NewData map[string]interface{}
}

type InsertMessage struct {
    baseMessage
    Data map[string]interface{}
}

// compile time check : all the above types implement the Message interface :
var _ Message = &QueryMessage{}
var _ Message = &UpdateMessage{}
var _ Message = &InsertMessage{}

https://play.golang.org/p/Uho_2loXpZ

关于go - 如何在 Go 中对这些类型建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388834/

相关文章:

go - 运行 go mod vendor 更新我的库

go - 数据类型突然改变

mongodb - ssh端口转发时如何解析远程服务器的域名

arrays - Golang : process took too long. 实现拼写检查

function - 函数可以作为参数传递吗?

go - 如何列出 Go 项目中的所有导入周期?

正则表达式一个或多个 vs n+1 匹配

go - 获取字符集字符串的编码器/解码器

go - 如何在 GO 中处理全局状态

go - 如何使用 gorilla 处理程序允许移动设备上的 OPTIONS 方法?