猿问

在函数内部导入

正如标题所问,有什么方法可以从函数内部导入go文件吗?我正在考虑为我的 discordgo( https://pkg.go.dev/github.com/bwmarrin/discordgo ) 程序使用一个循环。


前任 :


package main


import (

    ...

)


func main() {

    client, _ := disocrdgo.New("Bot " + mytoken)

    ...



    events, _ := ioutil.ReadDir("./events")

    for event, _ := range events {

        x, _ := import "MyApp/src/events/" + event // <---

        client.AddHandler(x.executor) // using type struct where executor is the function i want to use from the imported file

    }


    ...

}


我觉得有义务如此精确:感谢您的认真回答。


湖上湖
浏览 73回答 1
1回答

潇湘沐

导入是一个编译器概念,因此您不能在运行时导入包(源代码通常甚至不存在于运行程序的机器上)。您可以使用注册表模式来接近您要查找的内容。在事件包中,创建一个存储处理程序的函数。在每个事件处理程序包的 init 函数中调用该函数。在事件包中,创建另一个函数,将存储的处理程序添加到客户端。在主包中,导入您需要的所有事件处理程序包并调用第二个函数。这或多或少就是标准库中的 sql 和图像包的工作方式。请参阅sql.Register和image.RegisterFormat// events/registry.gopackage eventsvar handlers = map[string]interface{}{}func Register(name string, h interface{}) {&nbsp; &nbsp; handlers[name] = h}func ConfigureClient(client *discordgo.Session) {&nbsp; &nbsp; for _, h := range handlers {&nbsp; &nbsp; &nbsp; &nbsp; client.AddHandler(h)&nbsp; &nbsp; }}// events/foo/foo.gopackage fooimport "MyApp/src/events"func init() {&nbsp; &nbsp; events.Register("foo", executor{})}type executor struct{}// events/bar/bar.gopackage barimport "MyApp/src/events"func init() {&nbsp; &nbsp; events.Register("bar", executor{})}type executor struct{}// main.gopackage mainimport (&nbsp; &nbsp; _ "MyApp/src/events/foo"&nbsp; &nbsp; _ "MyApp/src/events/bar"&nbsp; &nbsp; // ...)func main() {&nbsp; &nbsp; client, _ := discordgo.New("Bot " + mytoken)&nbsp; &nbsp; events.ConfigureClient(client)}
随时随地看视频慕课网APP

相关分类

Go
我要回答