1.8 plugins e outras novidades Demonstração e novo recurso da 1.8 16 February 2017 Felipe Paes de Oliveira Senior developer at Nuveo Cesar Gimenes Senior developer at Nuveo
de vista O recuso de plugin é interessante mas da forma como esta não é util para todos, alguns projetos podem se bene ciar, mas no momento não é possível descarregar um plugin nem fazer alterações sem que o programa host também seja reiniciado.
negativos Plugin não pode ser descarregado, falta uma função close. Quando um plugin é carregado ele ca cacheado e se tentar recarregar novamente o mesmo plugin sem reiniciar o host o sistema quebra. Só funciona no Linux. Mac e outras plataformas caram para a versão 1.9.
positivos Fácil de implementar. Permite enviar código pré compilado para ser carregado sem requerer um deploy do sistema completo. Agora podemos modularizar nossos binários e carregar as funções em "lazy mode".
implementar Cria um plugin é muito parecido com criar um programa normal não requer nenhuma estrutura diferenciada. Apenas compilar com o seguinte comando. go build -buildmode=plugin hello.go Isso vai gerar um arquivo plugin.so para gerar com um nome diferente use o parâmetro -o nome.so Exemplo de plugin: package main import "fmt" func Hello() error { fmt.Println("Hello, plugins!") return nil }
funções via plugin Primeiro carregamos o arquivo .so var p *plugin.Plugin var err error p, err = plugin.Open("./plugin/plugin.so") if err != nil { fmt.Println(err) return }
funções via plugin Em seguida carregamos os símbolos do arquivo (funções) var s plugin.Symbol s, err = p.Lookup("Hello") if err != nil { fmt.Println(err) return } Hello := s.(func() error)
funções via plugin Por m podemos chamar a função como faríamos normalmente. err = Hello() if err != nil { fmt.Println(err) return } Mais exemplos de plugins (https://github.com/crgimenes/Go-Hands-On/tree/master/plugin)
coisas da 1.8 que queremos mencionar Tradicional melhoria no compilador HTTP1.1 lenta 0.5μs nas chamadas Agora o GOPATH tem valor default $HOME/go ou %USERPROFILE%/go O servidor HTTP agora tem um método "Shutdown(context) err" para parar o serviço graciosamente :D Você agora consegue atribuir uma struct diferente do tipo da variável desde que os campos das duas structs sejam iguais.
Proposta dos plugins (https://docs.google.com/document/d/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ/mobilebasic) Lentidão do HTTP1.1 (https://github.com/golang/go/issues/18964) Load dinamico de plugin (mas sem o close a memoria continua alocada toda vez) (https://github.com/campoy/golang-plugins/)
you Felipe Paes de Oliveira Senior developer at Nuveo [email protected] (mailto:[email protected]) https://www.felipeweb.net.br (https://www.felipeweb.net.br) https://github.com/felipeweb (https://github.com/felipeweb) @_felipeweb (http://twitter.com/_felipeweb) Cesar Gimenes Senior developer at Nuveo [email protected] (mailto:[email protected]) http://crg.eti.br (http://crg.eti.br) http://github.com/crgimenes (http://github.com/crgimenes) @crgimenes (http://twitter.com/crgimenes) Material da palestra: https://github.com/crgimenes/talks/blob/master/Go1.8/ (https://github.com/crgimenes/talks/blob/master/Go1.8/)