首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go插件变量初始化

Go插件变量初始化
EN

Stack Overflow用户
提问于 2017-04-03 09:47:22
回答 1查看 546关注 0票数 3

这是一个关于Go插件初始化的一般性问题。

我想在一个围棋程序中制作一个特定的包到一个Go插件。

包(例如mypackage)有一个变量,该变量由可执行文件中某个包的函数调用初始化。(例如,interface Logger类型的变量,它将由logger.CreateLogger函数初始化。)

为了使mypackage成为插件,我需要创建一个main包,将mypackage嵌入到main中,并在package main中导出一个api Init,它接受一个可以为我提供记录器的函数。

我想这样做,以减少我的插件的依赖性。mypackage插件应该依赖于interface Logger,而不是Logger的实现。

现在的问题是初始化,在可执行文件的情况下,初始化可以按以下方式进行:

代码语言:javascript
复制
package mypackage

var dlog = logger.CreateLogger("mypackage")

该记录器可用于任何func init()函数的mypackage

在转换到插件后,不能像这样初始化它。在调用main.Init之后,必须在以后的某个点初始化它。

插件打开时会调用func init,因此不能使用它初始化变量。

唯一的解决方案似乎是在每个包中创建一个函数,并从main包中导出的函数中调用它。

代码语言:javascript
复制
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,但不知道如何在插件的情况下使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 10:07:38

您的解决方案没有什么问题,但是如果您希望能够在变量声明和包init()函数中使用它,那么您就可以这样做。我也认为用这种方式使用插件更容易,但这需要在主应用程序和插件之间建立一个通用的共享包。

一种选择是创建一个“存储”包,它可以存储工厂函数或预先创建的记录器。

假设Logger接口定义在mylogger

代码语言:javascript
复制
package mylogger

type Logger interface { Log(string) }

例如,store

代码语言:javascript
复制
package store

import "mylogger"

var LoggerFactory func(string) mylogger.Logger

在您的主应用程序中,在之前初始化它,然后加载/打开mypackage插件:

代码语言:javascript
复制
package main

import "store"

func main() {
    store.LoggerFactory = logger.CreateLogger

    // Now proceed to load / open mypackage plugin
}

然后,mypackage插件可能如下所示:

代码语言:javascript
复制
package mypackage

import "store"

var dlog = store.LoggerFactory("mypackage")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43181410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档