Golang grupo de estudos

Exemplos, artigos e muito código Go

Unix Domain Socket com Golang

Unix domain socket Unix Domain Sockets ou IPC socket é uma forma muito pratica e segura de trocar informações entre processos. Essa forma de IPC usa um arquivo como endereço/name space no lugar de um IP e uma porta como seria em uma comunicação via rede. Uma coisa importante para ter em mente é que como vamos usar um arquivo o servidor é responsável por ele, se não existir ele sera criado automaticamente mas se não existir você vai receber um erro com algo como “bind: address already in use” que significa que o arquivo já existe e o servidor não tem como reaproveitar um arquivo que já existe, o correto é fazer shutdown elegantemente e fechar e apagar o arquivo antes de derrubar o servidor.

Um JSON lint em Golang

Um JSON lint em Golang Esse é um pequeno utilitário de linha de comando para validar e formatar JSON que também pode ser usado como pacote, a ideia inicial era criar um parser para validar o JSON mas não foi necessário, o próprio Go traz todas as informações que precisamos no erro inclusive o offset do erro e dai foi simples mostrar os erros de forma mais completa inclusive indicando com uma seta exatamente onde esta o erro.

Gerador de UUID

Gerador de UUID Mais um utilitário no nosso repositório do GoSidekick, um utilitário para gerar UUID v4 (aquele que é totalmente aleatório). package main import ( "fmt" "strings" "github.com/crgimenes/goconfig" "github.com/google/uuid" ) func main() { type configFlags struct { CarriageReturn bool `json:"cr" cfg:"cr" cfgDefault:"false"` LineFeed bool `json:"lf" cfg:"lf" cfgDefault:"false"` Uppercase bool `json:"u" cfg:"u" cfgDefault:"false"` Armored bool `json:"a" cfg:"a" cfgDefault:"false"` ArmorChar string `json:"ac" cfg:"ac" cfgDefault:"\""` NtoGenerate int `json:"n" cfg:"n" cfgDefault:"1"` IDSeparator string `json:"ids" cfg:"ids" cfgDefault:""` } cfg := configFlags{} err := goconfig.

Ebiten - Package para criar jogos em Golang

No episódio de hoje do grupo de estudos falamos do GoSidekick, um repositório onde estamos colocando alguns utilitários para ajudar o dia a dia do programador e também falamos sobre a Ebiten, um package muito completo para criar jogos com Golang. Código fonte de hoje: gosidekick ebiten ebiten page graphos Repositório do nosso grupo E você encontra mais exemplos aqui Pagina do grupo de estudos

Trafegando dados entre middleware http usando contexto em Golang

Trafegando dados entre middleware Já vimos como funciona um middleware HTTP e agora vamos ver como passar informação entre os middlewares. Isso é usado por exemplo para passar as credenciais de um usuário para o proximo middleware e qualquer outra informação que seja coletada em algum dos middlewares e você queria passar para frente. Antes de mais nada vamos fazer um exemplo para mostrar da forma mais clara possível quando os middlewares são executados, isso é muito importante porque erros no entendimento dessa ordem de execução é uma incrível fonte de bugs.

Como fazer HTTP middleware em Go tanto usando Negroni como usando a biblioteca padrão

Usar middleware HTTP são muito úteis para evitar duplicidade de código quando você tem vários endpoints na sua aplicação, por exemplo se você quiser ter certeza que as credenciais do usuário foram verificadas, ou que o conteúdo foi comprimido, e assim por diante. A coisa mais importante que se deve lembrar é que cada middleware vai ser chamado na ordem que foi registrado, então por exemplo podemos ter um middleware que tem a responsabilidade de preparar o ambiente, como abrir o banco de dados ou preparar o controle de sessão que vem antes do middleware que valida as credenciais do usuário.

Usando goto e label em Go

goto e label em Go A instrução goto tem uma má fama que vem do tempo do BASIC quando era usada indiscriminadamente e acabava tornando o código impossível de ler. Em linguagens modernas entretanto é uma instrução perfeitamente válida e desde que usada com critério pode ajudar a tornar seu código mais limpo. Alem de goto as instruções break e continue também aceitam labels, isso é muito util para quando por exemplo se quer sair de um for aninhado em outro for ou especificar para qual dos fors aninhados se quer fazer continue.

Um sistema de mensageria extremamente rápido com NATS e Golang

mensageria com NATS Para quem precisa que vários sistemas se comuniquem entre si e precisa de velocidade e simplicidade o NATS é uma grande ajuda. Uma das características mais interessantes é a incrível velocidade e um protocolo simples que pode ser facilmente implementado faz com que o NATS seja usado desde para IoT com bibliotecas cliente escritas até mesmo para Arduino quando para comunicação entre serviços muito maiores.

Testando código Golang no Travis-CI usando Docker

Testando o código Essa é uma daquelas gambiarras que salva nossa pele de vez em quando. Eu precisava rodar um código com um ambiente muito especifico e a única forma de montar o ambiente desse código com todas as peculiaridades dele é criar um containers docker, dessa forma consigo dizer exatamente a versão do que esta instalado e ter certeza que o ambiente esta perfeito. Mas daí eu precisava rodar os testes que são executados pelo Travis-CI e claro que não conseguia montar o ambiente idêntico ao do container no Travis.

Usando docker para carregar o Newsletter e PostgreSQL

Usando Docker Nesse episódio do grupo de estudos vimos como colocar uma aplicação para rodar dentro de um container Docker, também criamos um Makefile para ajudar a executar os comandos docker e todo o básico para rodar nosso newsletter em um container. Nosso exemplo de Makefile .PHONY: up up.build rmi stop down purge up: docker-compose up up.build: docker-compose up --build down: docker-compose down --remove-orphans stop: docker-compose stop rmi: docker system prune -f purge: docker system prune -fa Esse é nosso exemplo de Dockerfile já usando múltiplos estágios para só levar para a imagem final o executável e o mínimo para funcionar assim gerando uma imagem bem pequena.

Um newsletter feito com SendGrid, PostgreSQL e Golang

Ainda tem muito trabalho para fazer mas esse é o inicio do nosso sistema de newsletter, ele já faz algumas coisas bem legais como mandar mensagens via SendGrid e criar registros no PostgreSQL mas ainda temos muito trabalho pela frente. Apesar de ainda incompleto tem muita coisa útil do nosso dia a dia programando, coisas como gravar registros em um banco de dados, um servidor web, tratar um formulário, usar uma API e por ai vai.

JSON, criando seu próprio Marshal e Unmarshal

Continuando a conversa sobre interfaces e sobre manipulação de JSON tem um recurso muito útil que usamos para ajudar o nosso sistema a falar melhor com o PostgresQL e pREST. O formato de data padrão do Postgres é incompatível com o formato padrão do Go e o nosso sistema usa muito JSON para tanto mandar como receber informações do banco de dados. Ter que lembrar toda hora de fazer o parser da data para o formato correto simplesmente não é pratico, é muito melhor ensinar o Go como lidar com data e hora no bom e velho formato ISO 8601.

interface como um contrato

Falamos desse mesmo tema na nossa lista de exemplos do grupo de estudos sobre interfaces mas vamos isso foi la no longínquo ano de 2016 então vamos tentar fazer um novo exemplo para mostrar como usar uma interface como um contrato que permite você passar tipos diferentes para uma função ou aceitar tipos diferentes em uma interface desde que ele aceite implemente o contrato que em outras palavras significa implementar as funções descritas na interface.

interface vazia

Interface vazia é um tipo que aceita qualquer coisa, você pode passar o que quiser como parâmetros de função ou variáveis do tipo interface{}. Parece muito pratico a primeira vista mas quando usamos interface{} estamos jogando pela janela a validação de tipos feita em tempo de compilação e perdemos uma das grandes vantagens de uma linguagem compilada de tipagem forte e estática. E como a checagem de tipo não vai acontecer em tempo de compilação é sua responsabilidade checar se esta recebendo o tipo certo em tempo de execução.

JSON Dicas e Truques

Convertendo e validando JSON É sempre bom saber se o JSON é valido antes, isso poupa tempo de debug procurando um problema que não esta no seu código, para isso uma boa ferramenta on-line é o JSONLint Outra ferramenta on-line muito boa é o JSON-to-Go para converter arquivos JSON em struct Go, ele não vai converter partes repetitivas em sub-structs mas ajuda muito, principalmente quando a estrutura é muito grande e complexa.

rclone o rsync para cloud storage

rclone é o rsync para a nuvem, para você mover arquivos usando vários providers como Dropbox, Amazon S3, DigitalOcean, Google Drive e muitos outros. E claro, escrito em go, pode ser instalado com um simples “go get”. Links mencionados, alguns foram mencionados fora da gravação: rclone Fonte do rclone no GitHub Repositório do nosso grupo E você encontra mais exemplos aqui Pagina do grupo de estudos Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack e procure por #brazil

Acessando Dropbox com Golang

Precisei criar um pacote Go para ao Dropbox e fazer algumas operações basicas, listar arquivos, upload e download, para isso usei o dropbox-sdk-go-unofficial. Conectando Dropbox Para conectar o dropbox precisamos das credenciais de acesso, a forma mais fácil é criar um token, para isso entre em Dropbox developers apps e crie uma aplicação, então dentro do painel da aplicação crie o token. Configurando o sistema Todas as funções precisam das configurações com as credenciais de acesso e outros parâmetros úteis como por exemplo o nível de log.

Postgresql com FUSE, Hangout do grupo de estudos de Go 2018-07-26

Hoje complementamos o grupo de estudos passado mostrando como montar um banco de dados Postgresql como sistema de arquivos. Links mencionados, alguns foram mencionados fora da gravação: Código fonte de hoje FUSE Filesystem in Userspace Repositório do FUSE Fuse for macOS Repositório do nosso grupo E você encontra mais exemplos aqui Pagina do grupo de estudos Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar [entre no canal de Go no slack https://invite.

Filesystem com FUSE, Hangout do grupo de estudos de Go 2018-07-12

Hoje demonstramos como criar um pequeno sistema de arquivos em userland e em modo somente leitura. Apesar do exemplo ser simples criar um sistema de arquivos é algo bem poderoso, imagine poder usar todas as ferramentas que você já esta acostumado como grep, find e outras para por exemplo procurar informações no seu banco de dados sem nem mesmo precisar de SQL :D Links mencionados, alguns foram mencionados fora da gravação:

Usando gofn para subir containers docker e rodar Clojure e Python

Como carregar containers Docker usando gofn Primeiro instanciamos a struct BuildOptions que vai informar para o gofn os detalhes do container como o nome da imagem por exemplo. buildOpts := &provision.BuildOptions{ ImageName: "nome da imagem aqui", StdIN: "o que você quer passar no stdin para o container aqui", DoNotUsePrefixImageName: true, } Depois instanciamos as opções do container por exemplo se você quer passar variáveis de ambiente.