运行时如何动态加载Golang文件

运行时如何动态加载Golang文件 如何在运行时加载Go文件

5 回复

感谢@packs的澄清。那么请忽略我之前的回答。我原本的印象是Go二进制文件应该在运行时加载并执行Go源文件。

更多关于运行时如何动态加载Golang文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您需要在您的二进制文件中嵌入一个Go解释器。类似 Yaegi 这样的工具。

我们想要创建一个实用程序应用程序。 以下是步骤:

  1. 从用户处获取 JSON 文件输入
  2. 将 JSON 加载到结构体中(Go 结构体)
  3. 加载 HTML 模板
  4. 将 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工具链版本编译。

回到顶部