gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:54:34 26 4
gpt4 key购买 nike

我有多种这样的类型:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com