首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插件和包作用域的全局变量

插件和包作用域的全局变量
EN

Stack Overflow用户
提问于 2019-11-08 15:46:39
回答 1查看 308关注 0票数 2

我有一个Go包来管理配置。包在保存配置数据的init函数中初始化了一个非导出变量。用户通过内部访问全局变量的导出函数与配置进行交互。就像这样

代码语言:javascript
复制
pakage config

var gConfig ...

func init() {
    gConfig = ...
}

func Value(name string) (string, error) {
    return gConfig.value(name)
}

我正在考虑插件的使用,并探讨对我的配置包的影响。

如果插件导入配置包并调用其导出的一些函数,那么将使用什么gConfig变量?当插件加载时,插件会有它自己的gConfig变量初始化的内部配置实例吗?还是会在加载时动态链接插件以使用在程序启动时初始化的主程序gConfig变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 17:22:41

根据文件

包插件实现了Go插件的加载和符号解析。当第一次打开插件时,--所有尚未成为程序一部分的包的init函数--称为。主函数未运行。插件只初始化一次,不能关闭

此外,您不能导入相同的插件两次。

将在插件加载时使用自己的gConfig变量初始化插件的内部配置实例。

插件将在其作用域内有自己的变量。

如果插件导入配置包并调用其导出的一些函数,那么将使用什么gConfig变量?

在包中定义的变量,如您所演示的。

要验证这一点,请编写一个小演示。去是非常直截了当和有效率的,做它需要很短的时间,看。

代码语言:javascript
复制
    $ tree .
    .
    ├── main.go
    ├── plug
    │   └── plugin.go
    └── plugin.so

    1 directory, 3 files
代码语言:javascript
复制
// $ 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]
}
代码语言:javascript
复制
// $ 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"))
}

构建和运行

代码语言:javascript
复制
$ go build -buildmode=plugin -o plugin.so plug/plugin.go 
$ go run main.go 
rouge
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58769757

复制
相关文章

相似问题

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