business cargo cargo container city

Como fazer uma imagem Docker com multi stage build

Estando todos vivendo numa era onde computação em nuvem vem sendo cada vez mais adotada, saber trabalhar com containers acaba se torna praticamente uma obrigação.

Por isso, nesse post, vamos ver como criar uma imagem Docker otimizada com multi stage build para aplicações escritas em Golang.

Antes de começar escrever nosso Dockerfile, vamos criar um arquivo main.go e escrever uma pequena API para retornar o famoso “Olá Mundo”.

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(rw, "Olá Mundo\\n")
	})

	log.Fatal(http.ListenAndServe(":8000", nil))
}
Leia mais »
snow top mountain under clear sky

Como diminuir o tamanho da sua aplicação com ldflags

Como você deve ter visto no vídeo que postamos no canal, uma das formas de reduzir o tamanho de uma imagem docker para aplicações Go é utilizando a imagem scratch como base.

Mas e o binário? Como podemos reduzi-lo sem remover código?

É isso que vamos ver nesse post.

Para que tenhamos uma base de programa para testar os comandos que vamos ver nesse post, vamos escrever uma API bem simples.

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(rw, "Olá Mundo\\n")
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}
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 »

Como fazer benchmark do seu código

Muitas vezes quando vamos escolher um novo framework ou alguma lib, buscamos benchmarks para que nosso programa tenha a melhor performance possível. Isso é ótimo! Mas você já parou para fazer um benchmark do seu programa para tentar entender onde ele pode ser otimizado? Não sabe como? Então vamos ver como fazer.

A funções de benchmark ficam dentro dos arquivos *_test.go e tem, por convenção, o nome BenchmarkSuaFunc.

Muito similar a quando escrevemos testes, vamos usar o pacote testing do go, mas especificamente vamos usar o testing.B como parâmetro da nossa função de benchmark.

Para começar vamos aproveitar uma das funções do post “Qual a melhor forma para aumentar um array?“.

Leia mais »

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 »