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 »

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 »

Como utilizar generics em structs

A partir da versão 1.18 do Go, FINALMENTE temos o generics disponível para utilização. Em outros posts, que vou deixar aqui em baixo, já abordamos como utilizar generics em funções, como utilizar a contraint comparable e fizemos um pequeno benchmark para ver a diferença com funções comuns.

Essa semana enquanto fuçava no código fonte do Go, descobri que também podemos utilizar essa maravilha em structs.

Para demonstrar como utiliza-lo, vamos criar uma struct para fazer cache das structs PessoaFisica e PessoaJuridica.

Leia mais »

Como encontrar pontos de melhoria de performance

Nesse post vamos falar sobre a técnica de profiling, que consegue nos ajudar muito na hora de encontrar melhorias em relação a performance dos nossos programas, principalmente, consumo de memória e CPU.

Para realizar os testes, vamos recuperar o código que escrevemos no post “Qual a melhor forma de aumentar um array?

Apenas para relembrar, nesse post escrevemos 3 funções e 3 testes, um para cada função. Cada uma das funções mostrar uma forma diferente de expandir um array.

Tendo relembrado isso, vamos agora fazer o profiling de cada uma das funções e analisar o resultado.

Para coletar dados de cpu e memória, vamos adicionar as flags -memprofile e -cpuprofile no comando que executamos para fazer benchmark das funções.

Leia mais »

Otimizando funções com memoize

Em ciência da computação, memoize ou memoization é uma técnica de otimização que faz um cache do resultado de uma função com base nos parâmetros passados para ela.

Essa técnica faz com que a execução real da função só aconteça a primeira vez que o parâmetro ou conjunto de parâmetros é passado, pois como fará um cache do resultado, ao receber os mesmos parâmetros, retornará o valor que está armazenado no cache.

Antes de utilizar a técnica, vamos criar duas funções. A Primeira para calcular o fatorial de um número.

func fatorial(n int) int {
    total := 1
    for i := 2; i <= n; i++ {
        total *= i
    }

    return total
}
Leia mais »

Escrevendo testes unitários

Testes unitários nos ajudam muito a tentar manter a quantidade de bugs baixa, já que podemos testar várias hipóteses de forma automática. E por ser automatizada, a cada mudança que fazemos, os testes unitários também nos ajudam a garantir que não quebramos o sistema em partes que nem tocamos mas que dependem das mudanças que fizemos.

Embora exista alguns packages que ajudam na escrita dos testes unitários, a recomendação do time de desenvolvimento da linguagem é que os testes sejam escritos usando o package nativo da linguagem, pelo simples fato de que um package externo pode adicionar algum bug ou realizar algum teste de forma incorreta.

Antes de começar a escrever os testes, vamos criar um arquivo chamado soma.go e escrever uma pequena função que soma N valores.

package soma


func Soma(valores ...int) (total int) {
    for _, valor := range valores {
        total += valor
    }

    return
}
Leia mais »

Escrevendo funções em GO

Hoje vamos falar um pouco sobre um dos itens mais básico e importante de qualquer linguagem de programação, funções.

Funções nos ajudam a dividir o código de forma a ser reutilizável, diminuindo a quantidade de escrita de um bloco de código e facilitando a manutenção do programa. É claro que se alguém fizer uma função com 17 mil linhas de código, toda bagunçada e confusa, nada do que eu disse antes se torna verdade, mas sabemos que ninguém aqui faz ou já fez isso, certo? 😀

Assim como em qualquer outra linguagem, a premissa de uma função em Go é que ela execute somente aquilo que ela nasceu para executar. Dessa forma diminuímos a complexidade da função e aumentamos a possibilidade de reutilização da mesma.

Leia mais »

Resolvendo problemas com Go – #1 Remove Outermost Parentheses

Hoje iniciamos uma série de vídeos onde vamos resolver alguns problemas do LeetCode usando Go.

No vídeo de hoje vamos resolver o problema 1021. Remove Outermost Parentheses.

Se você achou uma forma melhor de resolver o problema ou ficou com alguma dúvida, deixe um comentário.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Quando usar/evitar append em seus programas

Nesse post vamos falar sobre como a função append funciona e quando devemos evitar sua utilização.

Em resumo, a função append nos ajuda a expandir um array, ou seja, se houver um array de tamanho 3 onde precisamos adicionar mais um item, o append irá aumentar o tamanho desse array para que ele comporte esse novo item.

Agora, você já se perguntou como isso acontece e qual o impacto na performance do seu programa?

Antes de falar sobre o append, vamos falar um pouco sobre como o Go armazena um array na memória.

Leia mais »