gpt4 book ai didi

go - 如何为服务器和事件句柄设计带有单独包的事件驱动 API?

转载 作者:行者123 更新时间:2023-12-01 22:26:40 28 4
gpt4 key购买 nike

背景

我有一个 服务器核心 包含 的软件包服务器 结构和所有用于从客户端发送/接收消息的核心逻辑。

服务器将以不同的方式运行 - 例如。欧盟、美国、澳大利亚。每种 flavor 都有自己的一组不同的方法,可以由客户端调用。

我想创建单独的包,其中包含(仅)这些方法。例如。 euhandles 包裹。

问题

这些方法,在某些情况下,不得不依赖原来的服务器 中实现的方法服务器核心 包裹。

这如何在 golang 中以优雅的方式设计?

潜在解决方案

(1) 只需将方法移动到单独的包中 - 不起作用

包 euhandles 无法在 servercore.Server 结构上创建方法。这在 Go 中是被禁止的(不能在第三方结构上创建方法)。

(2) 在单独的包中定义函数,然后简单地“注册”它们 - 不起作用

Server.RegisterHandle("someEventName",euhandles.methodFromEu)

问题 - methodFromEu 函数将无法访问任何服务器方法。

(3) 使用嵌入:
type serverEU struct { server *servercore.Server }
func (s *serverEU) HandleThat {}

s := new(serverEU)
s.server.registerHandle("someEventName", s.HandleThat)

问题 - 它变得有点麻烦(添加额外的层只是为了实现一些句柄/方法),看起来并不“干净”。

(4) 依赖注入(inject)

我只是在发布问题后不久就想到了这一点,为了全面起见添加:
# in euhandles:
func HandleThat(s *server)

# elsewhere:
s.registerHandle("someEventName", euhandles.HandleThat)

# in servercore:
func (s *server) registerHandle(name string, handleFunc func(*server)) {
s.handles[name]=func(s *server) { handleFunc(s)}
}

不确定这在 Go 程序员中被认为有多好/合适。

是否有任何惯用的、干净的方式将事件/句柄与核心服务器分开?

最佳答案

我要做的第一件事是使用嵌入,尽管没有额外的间接:

type ServerEU struct {  
*servercore.Server
}

s := ServerEU{Server:&baseServer}
s.registerHandle("someEventName", s.HandleThat)

您可以尝试的另一件事是服务器中的函数指针:
type Server struct {
// stuff
LocaleSpecificFunc func(args)
}

在包装中:
func NewUEServer() *Server {
s:=Server{//initializers}
s.LocaleSpecificFunc=func(args) {
// Here, LocaleSpecificFunc implementation can use s
}
return &s
}

关于go - 如何为服务器和事件句柄设计带有单独包的事件驱动 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59604229/

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