面试题答案
一键面试实现插件动态加载的基本步骤
- 编写插件代码:编写包含所需功能(如函数、结构体等)的Go代码,并将其编译为插件文件(
.so
格式)。 - 在主程序中加载插件:在主程序中使用
plugin
包的Open
函数打开插件文件。 - 获取插件中的符号:使用
Lookup
方法获取插件中定义的函数、变量或类型等符号。
示例代码
1. 编写插件代码(plugin.go
)
package main
import "fmt"
// Hello 返回一个问候字符串
func Hello() string {
return "Hello from plugin"
}
编译为插件:
go build -buildmode=plugin -o plugin.so plugin.go
2. 编写主程序代码(main.go
)
package main
import (
"fmt"
"plugin"
)
func main() {
// 打开插件文件
p, err := plugin.Open("plugin.so")
if err != nil {
fmt.Println("Failed to open plugin:", err)
return
}
// 获取插件中的Hello函数
symbol, err := p.Lookup("Hello")
if err != nil {
fmt.Println("Failed to lookup symbol:", err)
return
}
// 类型断言为函数类型
hello, ok := symbol.(func() string)
if!ok {
fmt.Println("Symbol is not of expected type")
return
}
// 调用插件中的函数
result := hello()
fmt.Println(result)
}
在上述代码中,首先编写了一个简单的插件,其中包含一个Hello
函数返回问候字符串。然后在主程序中,通过plugin.Open
打开插件文件,再使用Lookup
获取Hello
函数,经过类型断言后调用该函数并输出结果。