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
}
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
}
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: