我有一个Go包来管理配置。包在保存配置数据的init函数中初始化了一个非导出变量。用户通过内部访问全局变量的导出函数与配置进行交互。就像这样
pakage config
var gConfig ...
func init() {
gConfig = ...
}
func Value(name string) (string, error) {
return gConfig.value(name)
}我正在考虑插件的使用,并探讨对我的配置包的影响。
如果插件导入配置包并调用其导出的一些函数,那么将使用什么gConfig变量?当插件加载时,插件会有它自己的gConfig变量初始化的内部配置实例吗?还是会在加载时动态链接插件以使用在程序启动时初始化的主程序gConfig变量?
发布于 2019-11-08 17:22:41
根据文件
包插件实现了Go插件的加载和符号解析。当第一次打开插件时,--所有尚未成为程序一部分的包的init函数--称为。主函数未运行。插件只初始化一次,不能关闭。
此外,您不能导入相同的插件两次。
将在插件加载时使用自己的gConfig变量初始化插件的内部配置实例。
插件将在其作用域内有自己的变量。
如果插件导入配置包并调用其导出的一些函数,那么将使用什么gConfig变量?
在包中定义的变量,如您所演示的。
要验证这一点,请编写一个小演示。去是非常直截了当和有效率的,做它需要很短的时间,看。
$ tree .
.
├── main.go
├── plug
│ └── plugin.go
└── plugin.so
1 directory, 3 files// $ cat plug/plugin.go
package main
var pkgGlobal = map[string]string{}
func Set(k, v string) {
pkgGlobal[k] = v
}
func Get(k string) string {
return pkgGlobal[k]
}// $ cat main.go
package main
import (
"fmt"
"plugin"
)
func main() {
p, err := plugin.Open("plugin.so")
if err != nil {
panic(err)
}
var get func(string) string
{
x, err := p.Lookup("Get")
if err != nil {
panic(err)
}
get = x.(func(string) string)
}
var set func(string, string)
{
x, err := p.Lookup("Set")
if err != nil {
panic(err)
}
set = x.(func(string, string))
}
set("tomate", "rouge")
fmt.Println(get("tomate"))
fmt.Println(get("notomate"))
}构建和运行
$ go build -buildmode=plugin -o plugin.so plug/plugin.go
$ go run main.go
rougehttps://stackoverflow.com/questions/58769757
复制相似问题