
Язык Go поддерживает работу с системой плагинов на базе стандартного пакета plugin. Существенное ограничение заключается в том, что плагины работают только для приложений в Linux и в MacOS.
Каждый плагин реализуется как пакет main без объявления функции main. Создадим каталог plugin, а в нем следующий файл main.go:
package main
import (
"fmt"
)
var V int
func F() {
fmt.Printf("Hello, number %d\n", V)
}
Для сборки плагина нужно воспользоваться командой из каталога plugin
go build -buildmode=plugin
Фактически, в результате сборки будет создан so-файл нашего плагина (plugin.so). Для работы с плагинами пакет plugin предоставляет метод Open (загрузка so-файла и возврат указателя на объект Plugin) и метод Lookup (для доступа к переменным и функциям). Давайте попробуем подключить наше расширение к программе
package main
import (
"plugin"
)
func main() {
p, err := plugin.Open("plugin.so")
if err != nil {
panic(err)
}
v, err := p.Lookup("V")
if err != nil {
panic(err)
}
f, err := p.Lookup("F")
if err != nil {
panic(err)
}
*v.(*int) = 7
f.(func())() // "Hello, number 7"
}
На этом пока все. Для получения дополнительной информации вы можете обратиться к официальной документации.