1 回答
TA贡献1816条经验 获得超6个赞
导入是一个编译器概念,因此您不能在运行时导入包(源代码通常甚至不存在于运行程序的机器上)。
您可以使用注册表模式来接近您要查找的内容。
在事件包中,创建一个存储处理程序的函数。在每个事件处理程序包的 init 函数中调用该函数。
在事件包中,创建另一个函数,将存储的处理程序添加到客户端。
在主包中,导入您需要的所有事件处理程序包并调用第二个函数。
这或多或少就是标准库中的 sql 和图像包的工作方式。请参阅sql.Register和image.RegisterFormat
// events/registry.go
package events
var handlers = map[string]interface{}{}
func Register(name string, h interface{}) {
handlers[name] = h
}
func ConfigureClient(client *discordgo.Session) {
for _, h := range handlers {
client.AddHandler(h)
}
}
// events/foo/foo.go
package foo
import "MyApp/src/events"
func init() {
events.Register("foo", executor{})
}
type executor struct{}
// events/bar/bar.go
package bar
import "MyApp/src/events"
func init() {
events.Register("bar", executor{})
}
type executor struct{}
// main.go
package main
import (
_ "MyApp/src/events/foo"
_ "MyApp/src/events/bar"
// ...
)
func main() {
client, _ := discordgo.New("Bot " + mytoken)
events.ConfigureClient(client)
}
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报