1 回答

TA貢獻1816條經(jīng)驗 獲得超6個贊
導入是一個編譯器概念,因此您不能在運行時導入包(源代碼通常甚至不存在于運行程序的機器上)。
您可以使用注冊表模式來接近您要查找的內(nèi)容。
在事件包中,創(chuàng)建一個存儲處理程序的函數(shù)。在每個事件處理程序包的 init 函數(shù)中調用該函數(shù)。
在事件包中,創(chuàng)建另一個函數(shù),將存儲的處理程序添加到客戶端。
在主包中,導入您需要的所有事件處理程序包并調用第二個函數(shù)。
這或多或少就是標準庫中的 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 關注
- 88 瀏覽
添加回答
舉報