Como conectar e fazer CRUD em um banco PostgreSQL

Quando desenvolvemos programas que vão trabalhar com dados, sem sombra de dúvida uma das coisas mais importantes é armazenar esses dados com segurança e robustez.

Nesse post, vou mostrar como conectar e executar um CRUD utilizando um banco de dados PostgreSQL.

Antes de começar a escrever código, vamos fazer download do drive do postgres para Go com o comando go get github.com/lib/pq.

Ok, agora podemos começar.

Para ficar um pouco mais próximo da realidade, vou separar todas as operações em funções, incluindo a conexão com o banco.

Leia mais »

Como fazer encadeamento de métodos (chaining)

Chaining de métodos é uma técnica muito utilizada em linguagens como PHP, Java e C#. Se você não está familiarizado com o termo, não se preocupe, pois essa é uma técnica muito simples. Ela consiste em retornar um objeto para que outro método possa ser chamado sem a necessidade de atribuição a uma outra variável.

Essa técnica é muito utilizada em ORMs como o GORM, para construção de queries mais complexas.

No vídeo que postamos no nosso canal do youtube mostrando como construir uma API completa com go-chi e postgres (link para o vídeo), também podemos ver essa técnica sendo utilizada para fazer o decode da request para uma struct.

Para entender melhor seu funcionamento, vamos criar uma struct com 100% de seus atributos privados.

Leia mais »

Como utilizar go-chi para rotas e middleware

Durante muito tempo, gorilla/mux era o meu router favorito na hora de escrever APIs. Porém, desde que fiz o post sobre benchmark comparando gorilla/mux e go-chi (link para o post), meu router favorito tem sido o go-chi, pois sua performance é bem superior. E para ajudar, recentemente o projeto do gorilla/mux ficou sem mantenedor. ☹️

Por isso, resolvi fazer esse post para mostrar tudo o que você pode fazer com go-chi.

Para começar, vamos escrever um código muito simples para criar uma rota com o verbo GET.

Leia mais »

Como utilizar go workspaces

Dando continuidade aos posts onde exploramos as novas funcionalidades do Go 1.18, nesse post vamos ver como utilizar o novo Go Workspaces.

Para começar, vamos criar uma pasta e chama-lá de workspace.

Pequena observação antes de continuar, o nome dessa pasta NÃO tem que ser obrigatoriamente workspace, só coloquei esse nome por achar conveniente.

Agora, dentro da pasta workspace, vamos adicionar uma pasta chamada hello. Nessa pasta vamos colocar o nosso programa.

Dentro da pasta hello, vamos iniciar um novo módulo com o comando go mod init github.com/aprendagolang/hello e adicionar um arquivo main.go com o seguinte conteúdo.

Leia mais »

Quando utilizar generics?

Assim como as goroutines, uma das dúvidas que mais tenho visto quando o assunto é generics, a nova feature do Go 1.18, é quando ela deve ser utilizada.

Nesse post, baseado no post publicado em 12 de abril no blog oficial do Go (When to use generics), vou tentar passar um pouco das dicas dadas pelo Ian Lance Taylor.

Ele começa o primeiro vídeo falando sobre como escrever código Go. De forma muito simples e em tradução livre ele diz:

Escreva código, não desenhe tipos.

Leia mais »

Trabalhando com datas

Acho que um dos assuntos que mais causa confusão, depois talvez de goroutines e channels, é a manipulação de datas em Go.

Nesse post vou mostrar como manipular, comparar, formatar e fazer parse de datas em Go.

Para iniciar, vamos “printar” a data atual da forma mais simples possível.

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Println(now)
}
Leia mais »

Frameworks para teste ou package padrão?

Sem sombra de dúvida, frameworks sempre ajudam a acelerar o nosso trabalho. Eles implementam uma porção de funcionalidades que reduzem a quantidade de código que nós temos que escrever, o que nos traz produtividade.

Mas e quando o assunto são testes, será que esse ganho em produtividade compensa o risco?

Eu particularmente nunca utilizei um framework de testes em nenhum dos projetos GO que já desenvolvi. Parte disso pelo fato de eu ter começado a programar em Go em 2012, “quando isso aqui era tudo mato”.

Leia mais »

Quando utilizar Goroutines?

Uma dúvida que assombra a maioria dos desenvolvedores Go, e não exclusivamente iniciantes, é sobre quando utilizar goroutines.

Nesse post vou dar algumas dicas para ajudar na análise e tomada de decisão na hora de adotar ou não a utilização de goroutines em seu projeto.

Antes de mais nada, assim como qualquer coisa relacionada a tecnologia, nem todo projeto faz sentido utilizar goroutines. Você pode até pensar, “meu sistema está lento. Já sei, vou usar goroutines para resolver.”, gastar muito tempo, já que SÓ colocar um go antes da chamada da função pode não ser o suficiente, e no final não ver melhora nenhuma ou até mesmo notar uma piora no desempenho.

Leia mais »

O que é e como usar a nova constraint comparable

Desde a versão 1.18 do Golang, uma nova constraint está disponível para nos ajudar no dia a dia de trabalho.

Nesse post vamos explorar essa constraint para entender o que ela é e onde podemos utiliza-lá.

De forma bem simples, a constraint comparable é uma interface para todos os tipos onde podemos utilizar == ou != para compará-los, ou seja, podemos utilizá-la para ints, floats, booleans, strings, ponteiros, channels, structs onde todos os campos são comparáveis e arrays de tipos comparáveis.

Abaixo você pode ver um pequeno exemplo de sua utilização em uma função com generics.

Leia mais »

Como colocar rótulo em looping

Não sei vocês, mas a primeira vez que “ouvi” falar dessa feature foi há algumas semanas atrás. Mais uma vez, não foi em nenhum blog post ou vídeo do youtube que ví a utilização dessa feature, mas sim no código fonte da linguagem.

Com a minha experiência em outras linguagens, sempre que tinha que lidar com um looping dentro de outro, a maneira mais comum de fazer um “break” dos 2 loopings era com uma variável de controle.

Nessa estratégia, o looping interno altera essa variável e faz um break. Com seu valor alterado, o looping externo também faz um “break”.

Leia mais »