我有多种这样的类型:
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{}
}
它们都有两个共同的属性,Header
和Type
。最后,我需要将它们聚合成一组通用消息。
目前我的Message
界面是这样的:
type Message interface {}
所以我基本上做的是这样的事情(将它们全部转换到 Message 接口(interface)):
q := QueryMessage{ ... }
u := UpdateMessage{ ... }
i := InsertMessage{ ... }
allMessages := [3]Message { Message(q), Message(u), Message(i), }
这有效,但它丢失了所有类型信息,我希望仍然能够从 Message
中公开 Header
和 Type
类型(以便客户端代码理论上可以将基于 Type
的 Message
转换回其原始类型。
如何做到这一点?我想不出一个合适的方法,接口(interface)不能有属性,如果我把 Message
做成一个结构,Go 不允许我转换 e。 G。 QueryMessage
到 Message
了。
最佳答案
您的界面可以提供访问器:
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{}
关于go - 如何在 Go 中对这些类型建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388834/