这是一个关于Go插件初始化的一般性问题。
我想在一个围棋程序中制作一个特定的包到一个Go插件。
包(例如mypackage)有一个变量,该变量由可执行文件中某个包的函数调用初始化。(例如,interface Logger类型的变量,它将由logger.CreateLogger函数初始化。)
为了使mypackage成为插件,我需要创建一个main包,将mypackage嵌入到main中,并在package main中导出一个api Init,它接受一个可以为我提供记录器的函数。
我想这样做,以减少我的插件的依赖性。mypackage插件应该依赖于interface Logger,而不是Logger的实现。
现在的问题是初始化,在可执行文件的情况下,初始化可以按以下方式进行:
package mypackage
var dlog = logger.CreateLogger("mypackage")该记录器可用于任何func init()函数的mypackage。
在转换到插件后,不能像这样初始化它。在调用main.Init之后,必须在以后的某个点初始化它。
插件打开时会调用func init,因此不能使用它初始化变量。
唯一的解决方案似乎是在每个包中创建一个函数,并从main包中导出的函数中调用它。
package mypackage
var dlog Logger
func Init(f createLoggerType){
dlog = f()
yetanotherpackage.Init(f)
}
package main
func Init(f createLoogerType) {
mypackage.Init(f)
anotherpackage.Init(f)
}是否有更好的初始化方法?我试过检查github.com/facebookgo/inject,但不知道如何在插件的情况下使用它。
发布于 2017-04-03 10:07:38
您的解决方案没有什么问题,但是如果您希望能够在变量声明和包init()函数中使用它,那么您就可以这样做。我也认为用这种方式使用插件更容易,但这需要在主应用程序和插件之间建立一个通用的共享包。
一种选择是创建一个“存储”包,它可以存储工厂函数或预先创建的记录器。
假设Logger接口定义在mylogger中
package mylogger
type Logger interface { Log(string) }例如,store:
package store
import "mylogger"
var LoggerFactory func(string) mylogger.Logger在您的主应用程序中,在之前初始化它,然后加载/打开mypackage插件:
package main
import "store"
func main() {
store.LoggerFactory = logger.CreateLogger
// Now proceed to load / open mypackage plugin
}然后,mypackage插件可能如下所示:
package mypackage
import "store"
var dlog = store.LoggerFactory("mypackage")https://stackoverflow.com/questions/43181410
复制相似问题