面试题答案
一键面试实现插件动态加载的一般步骤
- 编写插件代码:
- 插件代码应包含可导出的函数或变量。在Go 1.19及以后版本,插件可以使用Go标准库进行构建。
- 插件代码需要使用
//go:build plugin
构建标签来标记,以便在构建时与主程序区分。
- 构建插件:
- 使用
go build -buildmode=plugin
命令构建插件。生成的插件文件通常是.so
(Linux)或.dll
(Windows)格式。
- 使用
- 在主程序中加载插件:
- 使用
plugin
标准库(Go 1.19+)来加载插件。 - 打开插件文件,通过
plugin.Open
函数。 - 查找并获取插件中导出的符号(函数或变量),使用
plugin.Lookup
函数。
- 使用
涉及的Go标准库
plugin
库:Go 1.19引入的标准库,用于支持插件的动态加载。
简单示例代码
插件代码(plugin.go
)
//go:build plugin
// +build plugin
package main
import "fmt"
// Hello 是一个导出函数
func Hello() {
fmt.Println("Hello from plugin!")
}
构建插件:
go build -buildmode=plugin -o myplugin.so plugin.go
主程序代码(main.go
)
package main
import (
"fmt"
"plugin"
)
func main() {
// 打开插件
p, err := plugin.Open("myplugin.so")
if err != nil {
fmt.Println("Error opening plugin:", err)
return
}
// 查找并获取导出函数
hello, err := p.Lookup("Hello")
if err != nil {
fmt.Println("Error looking up symbol:", err)
return
}
// 类型断言并调用函数
f, ok := hello.(func())
if!ok {
fmt.Println("Symbol is not of expected type")
return
}
f()
}
上述代码中,plugin.go
构建为插件,main.go
通过plugin
标准库加载该插件并调用其中导出的Hello
函数。