gpt4 book ai didi

go - 如何检查具体类型由哪些嵌入类型组成?

转载 作者:IT王子 更新时间:2023-10-29 01:38:39 24 4
gpt4 key购买 nike

我怀疑我正试图用鞋拔来以 OOP 方式行事,但我不知道做我想做的事的习惯用法。

我有一个消息结构,用于在客户端-服务器应用程序中传递数据:

type Message struct {
ID string `json:"id,omitempty"`
Type string `json:"type"`
Data interface{} `json:"data"`
}

这里的数据可以是不同的东西,例如一些命令:

type Command struct {
User *types.UserInfo `json:"user"`
}

type CommandA struct {
Command
A *AData `json:"a_data"`
}

type CommandB struct {
CommandB
B *BData `json:"b_data"`

}

我想做的是检查消息数据类型是否是一个命令,并执行所有命令共有的操作,例如授权,所有这些都在一个地方,而不必键入断言是什么类型的命令,调用适当的处理函数,然后执行身份验证,因为这会导致大量代码重复。

下面的代码反射(reflect)了我希望发生的事情。

for {
select {
case m := <-in:
// what I would like to do, obviously not working as
// m.Data is not of type Command but the actual command type
if c, ok := m.Data.(msg.Command); ok {
// do auth and other common stuff
}
switch t := m.Data.(type) {
case *msg.CommandA:
go srv.handleCommandA(m.ID, t)
case *msg.CommandB:
go srv.handleCommandB(m.ID, t)
// etc etc
default:
// do something
}
}
}

我该如何惯用地解决这个问题?

最佳答案

您可以在界面中定义常用的命令内容

type Commander interface{
DoCommonStuff()
}

为命令结构实现它

func (c Command) DoCommonStuff(){
//do stuff
}

然后断言

if c, ok := m.Data.(Commander); ok {
c.DoCommonStuff()
}

你的其他代码应该保持不变

关于go - 如何检查具体类型由哪些嵌入类型组成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43912149/

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