Go: плагины

Язык 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"

}

На этом пока все. Для получения дополнительной информации вы можете обратиться к официальной документации.

 

13.03.2019









 
архив

подписка