正如标题所说,我希望基于仅在运行时可用的信息动态加载Go包(或不动态加载).

其目标是允许用户通过添加新的原生脚本命令的自定义包来扩展程序.目前,每当我添加新命令或想要禁止某些命令时,我都需要编辑程序并重新编译,而如果我可以制作某种DLL或类似的东西,那么我可以创建一个"import"脚本命令来搜索和加载命名命令库.

出于好奇,我们讨论的程序是基于自定义命令的脚本库,我将其用于各种用途.

我提前做了一些搜索,结果看起来不太好,但我找不到明确的否.

推荐答案

Go还不支持动态库.Elias Naur最近发布了一些补丁,但尚未对它们进行审查,它们不太可能包含在Go 1.2中.你可以阅读关于谷歌群组的讨论:

据我所知,这是关于这个话题的最新讨论.

然而,还有另一种方法.您可以在单独的进程中启动您的插件,并使用net/rpc包与您的主应用程序进行通信.这还允许您动态启动/停止/重新编译单独的插件,并且它的优点是坏的插件不会使您的程序崩溃.围棋擅长网络沟通,你只要好好利用它就行了.

我需要编辑程序并重新编译,

您还可以考虑编写一个小脚本来监视当前目录中的更改(使用fstification)并执行"go build",然后重新启动您的程序.在本地开发期间,我在我的一些Web项目中使用了这种方法,它工作得很好.我无法观察到任何编译时间,而且我切换和刷新浏览器窗口的速度相当快.在我的Python开发周期中,解释器必须重新启动,每次更改都必须重新导入所有模块(在较大的项目中,这可能需要相当长的时间!),与之相比,我感觉非常笨拙.

Go相关问答推荐

SEARCH On Conflict Clause不考虑乐观锁定版本

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

如何使用我的 struct 化日志(log)记录格式使人panic ?

带有一个新变量的Go冒号等于运算符

Docker Compose Health Check未退出,错误为无法启动

通过渠道和goroutines增值1000倍

运行 Docker 容器 - X11 无法打开显示:0

你如何在 Golang 代码中测试 filepath.Abs​​ 失败?

设置 graphql 的最大文件上传大小(golang)

如何在 gocql 中设置最大池大小?

判断不同 go map 类型中的重复键

也许在 golang 中包(字符串和字符串类型不匹配)

SSH 代理,数据包长度错误

Golang - 无法从 pipped Windows 命令中获取结果

每 N 秒运行一次函数,上下文超时

出于某种原因,Golang (Go) AES CBC 密文被填充了 16 个 0x00 字节

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

是否可以动态加载 Go 代码?