Cesar Gimenes códigos, artigos, golang e unix

programação, eletrônica, golang, UNIX e muito mais papo nerd

Erro difícil com interfaces e switch case em Go

Este é um erro bem difícil de achar, basicamente a ordem dos cases do switch esta errada, o maior escopo esta em primeiro lugar fazendo com que o switch sempre pare nele, para resolver o problema basta mudar a ordem dos cases colocando os casos de menor escopo no inicio. Mas até ai já foi um tempão debugando código e litros de café :D package main import "fmt" type comptometer interface { Sum(a, b int) int } type foo struct{} func (_ foo) Sum(a, b int) int { return a + b } type bar struct{} func (_ bar) Sum(a, b int) int { return a + b } // func printType(e comptometer) { /* Este switch esta na ordem errada e vai imprimir sempre "comptometer interface" e nunca via entrar nos outros cases do switch.

Cobertura de testes em HTML

Uma forma visual de acompanhar a cobertura de testes dos seus projetos Golang. Go tem muitas ferramentas uteis, vale a pena dar uma olhada no go tool. Aqui tem um exemplo simples que cria um arquivo HTML e abre no seu navegador para visualizar facilmente a cobertuda de testes. gocover () { t="/tmp/go-cover.$$.tmp" go test -coverprofile=$t $@ && \ go tool cover -html=$t && \ rm $t }

Quine implementado em Golang

Imprimindo seu proprio fonte Quine é um programa que consegue imprimir seu código fonte na saída padrão. O nome é em homenagem ao matemático e filosofo Willard Van Orman Quine. Leia sobre Quine na Wikipedia, Willard Van Orman Quine Implementação em Golang package main func main() { aspa := string(96) print(codigo, aspa, codigo, aspa) } const codigo = `package main func main() { aspa := string(96) print(codigo, aspa, codigo, aspa) } const codigo = ` Codigo fonte: exemplo no Golang Playground exemplo no grupo de estudos

PostgreSQL via SSL com Golang

Configurando PostgreSQL com SSL Criando o certificado Primeiro vamos criar um certificado de testes, claro que quando for usar em produção você deve usar um certificado gerado por uma entidade certificadora reconhecida. Com o comando abaixo vamos criar dois arquivos server.crt e server.key que vamos usar para configurar o PostgreSQL. openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=example.com" Configurando PostgreSQL Edite o arquivo postgresql.

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.

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.