Golang plugins

Plugins são um dos poucos recursos quase esquecidos do Go e, francamente, eu desaconselho seu uso. Ao contrário de outros recursos da linguagem, plugins funcionam apenas no Linux, BSD e macOS. Como são baseados no dlopen, você não pode descarregar nem substituir um plugin depois de carregá-lo. Além disso, é necessário usar CGO, o que pode trazer mais complicações.

Apesar dos problemas, plugins são recursos interessantes e podem ser úteis em alguns casos, como carregar um módulo de forma dinâmica.

Antes de compilar o plugin, é necessário habilitar o CGO.

export CGO_ENABLED=1

Um plugin é escrito da mesma forma que estamos acostumados. Veja o exemplo abaixo.

package main

import "fmt"

func Hello() error {
    fmt.Println("hello, plugins!")
    return nil
}

código fonte

Crie um projeto normalmente, mas não o nomeie como plugin, pois isso causa um erro de compilação.

Para compilar um plugin, use o parâmetro -buildmode=plugin.

go build -buildmode=plugin

Isso cria um arquivo hello.so que contém as funções que podem ser carregadas por um programa principal.

Caso queira que um plugin tenha um nome diferente de hello.so, use o parâmetro -o como no exemplo:

go build -buildmode=plugin -o novonome.so

Para usar um plugin, primeiro carregue o arquivo.

var p *plugin.Plugin
var err error

p, err = plugin.Open("./hello/hello.so")
if err != nil {
    fmt.Println(err)
    return
}

Em seguida, procure pela função dentro do arquivo do plugin.

var s plugin.Symbol

s, err = p.Lookup("Hello")
if err != nil {
    fmt.Println(err)
    return
}

A variável s é uma interface. Converta-a para a mesma assinatura da função Hello que veio do plugin. Crie uma variável com o mesmo nome da função para chamá-la diretamente.

Hello := s.(func() error)

Agora, você pode chamar a função Hello normalmente, como qualquer outra função do seu código.

err = Hello()
if err != nil {
    fmt.Println(err)
    return
}

código fonte

O recurso de plugins pode ser útil para criar sistemas menos monolíticos. No entanto, isso não parece tão relevante hoje como era no passado. A falta de suporte para outras plataformas, a necessidade do CGO e a impossibilidade de descarregar plugins tornam o recurso menos interessante.

Vídeo com a explicação do código:

Cesar Gimenes

Última modificação