Подтвердить что ты не робот

Разрабатывать плагины в Go?

Можно ли запустить динамически, чтобы его можно было использовать для подключаемого приложения?

В eclipse мы можем создать некоторые плагины, которые Eclipse может выполнять динамически.

Можно ли сделать то же самое в Go?

4b9b3361

Ответ 1

Я буду утверждать, что это две отдельные проблемы:

  • с динамической нагрузкой
  • с плагинами

Первый - просто нет: программа Go Go статически связана, что означает, что вы не можете добавить код в запущенную программу. И это также означает, что вы должны скомпилировать программу, чтобы она могла интегрировать плагины.

К счастью, вы можете определить программу, принимающую плагины в Go, как на большинстве языков, а Go с интерфейсами и быстрой компиляцией не делает эту задачу трудной.

Вот два возможных подхода:

Решение 1: плагин, встроенный в основную программу

Подобно плагинам Eclipse, мы можем интегрировать "плагины" в основную память программы, просто перекомпилируя программу. В этом смысле мы можем, например, сказать, что драйверы базы данных являются плагинами.

Это может показаться не таким простым, как в Java, поскольку вы должны иметь перекомпиляцию, и вы должны в какой-то момент вашего кода импортировать "плагин" (см. как это сделать для базы данных драйверы), но, учитывая стандартизацию Go относительно каталогов и импортов, кажется легко справиться с тем, что простой make файл импортирует плагин и перекомпилирует приложение.

Учитывая легкость и скорость компиляции в Go и стандартизацию структуры пакета, это кажется мне очень жизнеспособным решением.

Решение 2: отдельный процесс

Это особенно удобно в Go для связи и обработки асинхронных вызовов. Это означает, что вы можете определить решение, основанное на многих процессах, передаваемых по именованным каналам (или в любом сетевом решении). Обратите внимание, что в Go есть rpc package. Это, вероятно, было бы достаточно эффективным для большинства программ, и основная программа могла бы запускать и останавливать процессы плагина. Это очень хорошо похоже на то, что у вас есть в Eclipse, с дополнительными преимуществами защиты памяти.

Последняя записка от кого-то, кто написал несколько плагинов Eclipse: вы не хотите этого беспорядка; держите это просто.

Ответ 2

Как уже говорилось, не удалось загрузить пакеты во время выполнения.

В будущем (или сегодня с ограничениями) может быть возможно иметь эту функцию с такими проектами, как go-eval, который является "начало интерпретатора для Go".

Ответ 3

Go 1.8 поддерживает плагины (будет выпущен в ближайшее время в феврале 2017 г.)

https://tip.golang.org/pkg/plugin/