Golang grupo de estudos

Exemplos, artigos e muito código Go

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.

Usando defer para mudar o valor de retorno

Hoje mostramos como usar o defer e alterar o valor de retorno de uma função. package main import ( "fmt" ) func processValue1(s string) (ret int) { for _, v := range s { if v != '0' { ret = (ret + 1) * 4 return } ret++ } ret = (ret + 1) * 4 return } func processValue2(s string) (ret int) { defer func() { ret = (ret + 1) * 4 }() for _, v := range s { if v !

O pacote termbox

Hoje mostramos um pequeno jogo feito estilo anos 80 para terminal usando o pacote termbox que ajuda muito na criação de aplicativos em modo texto. Também falamos sobre canais e como usar o comando select para fazer o loop de eventos do nosso jogo. Na parte “out of the records” falamos de retrocomputação, horta vertical, sistemas de irrigação robotizado e por ai vai. Links mencionados, alguns foram mencionados fora da gravação:

O pacote readline

Hoje falamos sobre o pacote readline, um pacote bem útil quando se quer receber entradas do usuário via linha de comando, por exemplo usamos readline para o REPL da Rumlang. Na parte “out of the records” falamos de tudo, desde a compra do GitHub pela Microsoft até criptomoedas e blockchain então se você esta assistindo isso pelo Youtube tente participar dos hangouts, tem muito mais coisas para você se divertir e aprender.

O pacote archiver

Nessa edição falamos do pacote archiver que é uma forma ferramenta muito simples para criar e extrair arquivos comprimidos de vários tipos diferentes e pode ser usado tanto como pacote dentro do seu programa como direto na linha de comando. Também falamos mais um pouco sobre testes e mostramos uma pequena armadilha que pode te poupar algum tempo depurando código. Links mencionados, alguns foram mencionados fora da gravação:

golang build tags

Hangout do nosso grupo de estudos de Golang. Um papo bem legal sobre a linguagem que a gente adora. Hoje falamos de como usar as build tags para fazer compilação condicional em golang. Links mencionados, alguns foram mencionados fora da gravação: Exemplo de build tags no grupo de estudos Documentação do pacote build Go advanced testing tips & tricks Using Go’s build constraint tag to help build mock services for service testing Repositório do nosso grupo E você encontra mais exemplos aqui Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack e procure por #brazil

json.Marshal

Algumas dicas rápidas para usar json.Marshal Os campos da struct que você quer colocar dentro do JSON, ou seja, “fazer o Marshal”, precisam ser declarados com a primeira letra maiúscula tornando esses campos públicos, caso contrário a função Marshal não consegue encontrar os campos. O retorno de json.Marshal é um array de bytes, para converter para string basta fazer cast (forçar a conversão) usando string(nomeDoVetor). É uma boa prática usar os nomes dos campos quando for popular a struct.

HasPrefix

Hangout do nosso grupo de estudos de Golang. Um papo bem legal sobre a linguagem que a gente adora. Links mencionados, alguns foram mencionados fora da gravação: Pegando o começo de uma string com Go ou Python Awesome Go Código fonte do pacote strings Repositório do nosso grupo E você encontra mais exemplos aqui Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack e procure por #brazil

The Star Wars API

Hangout do nosso grupo de estudos de Golang. Um papo bem legal sobre a linguagem que a gente adora. Links mencionados, alguns foram mencionados fora da gravação: SWAPI: https://swapi.co A SWAPI client written in Go: https://github.com/peterhellberg/swapi JSON Server: https://github.com/typicode/json-server Repositório do nosso grupo: https://github.com/go-br/estudos E você encontra mais exemplos aqui: https://github.com/go-br Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack https://invite.

Gerando posts do HUGO via Go

Hangout do nosso grupo de estudos de Golang. Um papo bem legal sobre a linguagem que a gente adora. Links mencionados, alguns foram mencionados fora da gravação: Código do gerador de posts: https://github.com/go-br/sitegen curl-to-Go: https://mholt.github.io/curl-to-go/ JSON-to-Go: https://mholt.github.io/json-to-go/ Repositório do nosso grupo: https://github.com/go-br/estudos E você encontra mais exemplos aqui: https://github.com/go-br Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack https://invite.slack.golangbridge.org/ e procure por #brazil

XML e Pizza

Hangout do nosso grupo de estudos de Golang. Um papo bem legal sobre a linguagem que a gente adora. Links mencionados, alguns foram mencionados fora da gravação: Pizza De Dados http://pizzadedados.com Exemplo de XML do nosso grupo https://github.com/go-br/estudos/tree/master/xml Repositório do Ricardo https://github.com/chapzin/GoSped/blob/master/Model/NfeProc.go Repositório do nosso grupo: https://github.com/go-br/estudos E você encontra mais exemplos aqui: https://github.com/go-br Nossos encontros ocorrem todas as quintas-feiras ás 22h00, para participar entre no canal de Go no slack https://invite.

XML

XML Este é um exemplo de como ler um feed RSS2 e interpretar o retorno para extrair os dados que queremos. Primeiro criamos as structs que vão conter os dados vindos do XML // RSS contem a base da estrutura do feed type RSS struct { XMLName xml.Name `xml:"rss"` Version string `xml:"version,attr"` Title string `xml:"channel>title"` Link string `xml:"channel>link"` Description string `xml:"channel>description"` PubDate string `xml:"channel>pubDate"` ItemList []Item `xml:"channel>item"` } // Item contem os posts no feed type Item struct { Title string `xml:"title"` Link string `xml:"link"` Description string `xml:"description"` Content string `xml:"encoded"` PubDate string `xml:"pubDate"` Comments string `xml:"comments"` } Então baixamos o feed da internet