Pular para o conteúdo principal

victorstein.dev

43/100 Dias de Golang - Webservers com Gin

# Webservers com Gin

Golang tem vários frameworks web como Fiber, Echo, Iris, Chi, Http Router, Beego, mas o que escolhi para falar aqui foi o Gin. Gostei dos exemplos, da documentação e de como ele parece fácil de usar. Vamos estruturar uma aplicação bem simples com ele! A instalação deve ser feita com go get -u github.com/gin-gonic/gin

# Retornando um JSON

Assim como no exemplo do dia 42, vamos retornar um JSON. Veja a simplicidade do uso do Gin!

Ler Mais

42/100 Dias de Golang - Webservers em Go com a Biblioteca Padrão

# Webservers em Go com a Biblioteca Padrão

Como vimos até aqui Go possui ótimas bibliotecas na própria linguagem, vamos ver como funciona a net/http, que podemos usar para criar webservers. Vamos criar um webserver com uma rota que retorna um “Olá Mundo”.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", homeHandler)
    fmt.Println("Servidor rodando na porta 8080...")
    http.ListenAndServe(":8080", nil)
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Olá Mundo!")
}

Olhe como é simples! http.HandleFunc("/", homeHandler) definimos o path da rota e a função que será executada, nesse caso a homeHandler. E depois depois deixamos o serviço escutando na porta 8080 http.ListenAndServe(":8080", nil). Fechou! Se você entrar no http://localhost:8080/ vai ver a mensagem “Olá Mundo!”. Claro que esse exemplo é “ridículo”, mas veja a estrutura geral, muito simples! Vamos evoluir esse exemplo.

Ler Mais

41/100 Dias de Golang - Gerenciando Configurações

# Gerenciando Configurações

Gerenciamento de configurações e variáveis é uma etapa bem importante para qualquer projeto em qualquer linguagem. Como venho do Python, estava buscando algo parecido com o Dynaconf. Vou mostrar o gerenciamento de variáveis de ambiente sem nenhuma lib em Golang e depois usando a bibilioteca envconfig e Viper. Separar configuração do códig é uma prática fundamental. Isso facilita o deploy em diferentes ambientes sem precisar alterar o código. É também uma recomendação clássica do manifesto Twelve-Factor App. Veja esse exemplo bem simples utilizando o os.Getenv

Ler Mais

40/100 Dias de Golang - Cobra CLI

# Cobra CLI

Vamos iniciar o desenvolvimento de um CLI utilizando o Cobra. O Cobra é uma biblioteca poderosa para criar CLIs em Go. Ela é usada por ferramentas populares como o Kubernetes e o Hugo. Vamos iniciar um projeto e adicionar o Cobra.

go mod init novacli

Instalar o cobra

go install github.com/spf13/cobra-cli@latest

Para iniciar o projeto com cobra utilizamos o comando:

cobra-cli init

Isso criará uma estrutura básica com um comando raiz (cmd/root.go).

Ler Mais

39/100 Dias de Golang - Logging com Zap

# Logging com Zap

Zap é uma biblioteca de logging criada e mantida pela Uber, projetada com foco em velocidade, eficiência e estrutura. É uma das bibliotecas de log mais rápidas para Go, segundo benchmarks do próprio repositório do Zap. Possui facilita integração com sistemas como ELK, Grafana Loki, Datadog, …

Vamos criar um projeto e instalar o Zap:

go get go.uber.org/zap

Veja como fica o código usando o SugaredLogger

Ler Mais

38/100 Dias de Golang - Logging

# Logging

Outro biblioteca padrão da linguagem Go! Muito simples de usar e cobre a maior parte dos casos de uso comuns — sem precisar instalar nada! Vamos ver o nosso primeiro log

package main

import (
	"log"
)

func main() {
	log.Println("Olá, mundo!")
}

Veja que a saída é automaticamente formatada com o timestamp atual

2025/04/19 15:36:27 Olá, mundo!

Uma funcionalidade muito legal que eu encontrei é o log para no caso de um erro. A função log.Fatal imprime a mensagem e depois chama os.Exit(1) — ou seja, o programa termina imediatamente

Ler Mais

37/100 Dias de Golang - Strings

# Strings

Vamos ver como funciona a biblioteca padrão do golang para manipulação de strings. Esse pacote oferece funções para busca, substituição, divisão, transformação e muito mais. Obviamente que o nome do pacote é strings.

Para saber se uma string contém outra, use strings.Contains:

s := "victorstein.dev"
if strings.Contains(s, "victor") {
    fmt.Println("Achou!")
}

Fazer o replace de um substring

s := "victorstein.dev"

nova := strings.ReplaceAll(s, ".dev", ".com")
fmt.Println(nova) // victorstein.com

Dividir strings

partes := strings.Split("a,b,c", ",")
fmt.Println(partes) // [a b c]

Juntar

Ler Mais

36/100 Dias de Golang - Select Goroutines

# Select Goroutines

Fiz vários posts falando sobre goroutines:

  1. 17/100 Dias de Golang - Concorrência e Goroutines
  2. 18/100 Dias de Golang - Goroutines, WaitGroup, Race condition e Mutex
  3. 19/100 Dias de Golang - Channels
  4. 20/100 Dias de Golang - Exemplo de goroutines, mutex e channels

Segundo o roadmap.sh do Golang, não fiz um post falando sobre Select, vamos corrigir isso então.

Se você já usou uma linguagem que possui switch, vai notar que select funciona de maneira semelhante, mas é voltado para a comunicação entre canais. O select permite que uma goroutine espere em múltiplos canais ao mesmo tempo. Ele escolhe um dos casos cujo canal está pronto para receber ou enviar e executa o bloco correspondente. Veja a sintaxe básica:

Ler Mais

35/100 Dias de Golang - Error Handling

# Error Handling

O tratamento de erros em Go é bem diferente do que em outras linguagem, não temos o tradicional try/except. Os erros em Go são simplesmente retornados como uma variável normal, daí que surge o famoso if err != nil {} do Golang. Nas primeiras vezes que vi essa estrutura foi meio estranho, mas depois fez bastante sentido. Essa estrutura vai completamente de encontro ao design da linguagem do Golang, manter a simplicidade e eficiencia da linguagem. Vamos criar uma função de divisão e retornar um erro quando o divisor é 0.

Ler Mais

34/100 Dias de Golang - Como o Runtime do Golang Gerencia Goroutines

# Como o Runtime do Golang Gerencia Goroutines

O scheduler do Go é responsável por organizar e distribuir a execução das goroutines nas threads do sistema operacional. Como já falamos em outro post sobre as goroutines são muito mais leves que threads, então você pode ter milhares rodando ao mesmo tempo. Mas como o sistema operacional tem um número limitado de threads, o scheduler cuida de organizar quais goroutines rodam em quais threads e quando.

Ler Mais