运行时如何动态加载Golang文件
运行时如何动态加载Golang文件 如何在运行时加载Go文件
5 回复
感谢@packs的澄清。那么请忽略我之前的回答。我原本的印象是Go二进制文件应该在运行时加载并执行Go源文件。
更多关于运行时如何动态加载Golang文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
您需要在您的二进制文件中嵌入一个Go解释器。类似 Yaegi 这样的工具。
我们想要创建一个实用程序应用程序。 以下是步骤:
- 从用户处获取 JSON 文件输入
- 将 JSON 加载到结构体中(Go 结构体)
- 加载 HTML 模板
- 将 HTML 与结构体绑定
在这种情况下,用户可以创建任何类型的 JSON。开发者并不知道 JSON 的结构。因此,我们需要一些代码来加载 JSON 和结构体。
不知道 JSON 的结构
通常的解决方案是将其解组到 map[string]interface{} 中,然后根据映射的内容做出决定。你可以使用 reflect.StructOf 来动态构建结构体类型,但这并不是非常地道的 Go 风格。Go 倾向于静态的、编译时的类型安全,而不是动态的。
由于模板可以从映射中填充数据,因此可以节省一步,跳过结构体。
map[string]interface{}
reflect.StructOf
在Go运行时动态加载代码文件可以通过插件(plugin)机制实现。以下是一个示例:
package main
import (
"fmt"
"plugin"
)
func main() {
// 加载编译好的插件文件
p, err := plugin.Open("plugin.so")
if err != nil {
panic(err)
}
// 查找导出的函数
sym, err := p.Lookup("Greet")
if err != nil {
panic(err)
}
// 类型断言并调用函数
greetFunc := sym.(func(string) string)
result := greetFunc("World")
fmt.Println(result)
}
插件文件 plugin.go:
package main
func Greet(name string) string {
return "Hello, " + name + "!"
}
编译插件:
go build -buildmode=plugin -o plugin.so plugin.go
注意:插件功能仅支持Linux、macOS和FreeBSD,且要求主程序和插件使用相同的Go工具链版本编译。

