【发布时间】:2024-01-20 10:22:01
【问题描述】:
我怀疑我试图强迫 go 以 OOP 方式行事,但我不知道 go 习惯用法来做我想做的事。
我有一个 Message 结构,用于在客户端-服务器应用程序中传递数据:
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"`
}
我想要做的是检查消息数据类型是命令并执行所有命令共有的操作,例如授权,都在一个地方,而不必键入断言什么类型的命令,调用适当的处理函数,然后进行身份验证,因为这会导致大量代码重复。
下面的代码反映了我想要发生的事情。
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
}
}
}
如何用惯用的方式解决这个问题?
【问题讨论】:
标签: go composition embedding