Como funciona for com range

Em Go, o for é uma ferramenta poderosa e flexível para realizar iterações. Dentro desse contexto, o uso do range é uma forma comum de percorrer slices, maps, strings, arrays e channels. Porém, entender como o range funciona internamente é essencial para evitar erros sutis, especialmente ao lidar com ponteiros.

Neste post, exploraremos os fundamentos do range em Go, destacaremos diferenças entre loopings com e sem range, e discutiremos erros comuns que surgem ao usar o range com ponteiros.

Avaliando a expressão

Sem range

O for em Go pode ser usado de forma simples e direta para controlar iterações com base em uma condição.

Leia mais »
package html/template

Como renderizar templates HTML em Go

Dando continuidade ao post sobre como criar websites em Go, vamos nos aprofundar um pouco mais no package html/template, ou seja, vamos ver como renderizar variáveis, criar condicionais e loop dentro de um template HTML.

Variáveis

No package html/template, as variáveis permitem injetar conteúdo dinâmico nos seus templates HTML.

Um variável é identificada no template por {{.NomeDaVariavel}}. Por exemplo:

<title>{{.Titulo}}</title>
Leia mais »

Dicas e práticas sobre error handling em Go

Hoje vamos falar sobre um tópico crucial em Go, como lidar com erros. Em Go, erros são valores importantes e devem ser tratados com cuidado.

Definindo um error

Primeiramente, em Go, um erro é qualquer valor que implementa a interface error. Esta interface tem um único método: Error() string.

type MyError struct {
    Message string
    Code    int
}

func (e *MyError) Error() string {
    return fmt.Sprintf("error: %s, code: %d", e.Message, e.Code)
}
Leia mais »

Como executar testes rápidos em Go

Se você trabalha ou já trabalhou em um grande projeto com uma alta cobertura de testes, com certeza você já passou raiva na hora de executar os testes da aplicação localmente.

Isso por que, quanto maior o projeto e mais bem coberto por testes, maior o tempo para executar todas as validações.

Pois bem, hoje venho te mostrar duas formas de continuar com uma ótima cobertura de testes, porém economizar um bom tempo na hora de executá-los localmente ou na abertura de PRs.

Leia mais »

gonew: Como criar projetos a partir de templates

Ouvindo aos pedidos da comunidade, mesmo que não incorporado oficialmente ao CLI do Go ainda, o time de desenvolvimento da linguagem Go criou um novo programa capaz de ajudar a iniciar novos projetos. Seu nome, pelo menos por enquanto, gonew.

Como dito no parágrafo anterior, a finalidade desse novo programa é auxiliar na criação de novos projetos Go. Com ele, podemos utilizar um repositório template como base para novas aplicações.

Sem mais delongas, vamos meter a mão na massa, ou melhor, no teclado.

Instalação

Para conseguir utilizar esse novo programa, precisamos tê-lo instalado. A forma mais fácil, já que você muito provavelmente tem o Go instalado na sua máquina, é utilizar o comando go install.

go install golang.org/x/tools/cmd/gonew@latest
Leia mais »

Como utilizar logs estruturados com log/slog

Lançado recentemente, o Go 1.21 trouxe um novo package padrão na linguagem, o log/slog. Embora Go tenha um package de logs desde seu lançamento, ao longo dos anos, ficou claro que as aplicações Go precisavam de logs estruturados.

Diferente do formato padrão em texto puro, logs estruturados utilizam o formato chave=valor, facilitando muito na hora de fazer parse, buscar e analisar os logs.

Embora existam vários packages open source que desempenham esse papel, sendo o logrus um dos mais famosos, todos os anos, a comunidade continuava pedindo ao time do Go que essa funcionalidade fosse adicionada ao package oficial da linguagem.

Nesse post, vou explorar um pouco desse package, mostrando as principais funções e formas de utilização.

Leia mais »

Como implementar uma API com arquitetura hexagonal

Hoje iniciamos mais uma pequena série aqui no blog, onde vamos implementar uma pequena API utilizando arquitetura hexagonal. Essa série será dividida em pelo menos quatro posts, sendo esse primeiro a definição da estrutura de pastas.

Se você ainda não conhece muito bem essa arquitetura, convido você a ler o post onde explico a parte teórica da arquitetura hexagonal.

Agora que estamos todos no mesmo ponto, vamos começar a definir a estrutura de pastas desse pequeno projeto.

pkg

No root do projeto, como já é de costume, precisamos de uma pasta onde ficarão as implementações que podem ser compartilhadas com outros projetos, ou seja, implementações de packages que não tem nenhuma regra de negócio.

Leia mais »

Como utilizar o framework Echo

Mesmo sem saber ainda se será uma série ou não, nesse post, trago uma visão geral sobre um dos frameworks mais populares do mundo Go, o Echo.

Em sua documentação, o framework Echo se autodenomina como de alta performance, extensível e minimalista. Além dessas características, podemos dizer também que é de fácil implementação. Veja o exemplo abaixo.

package main

import (
    "net/http"
    
    "github.com/labstack/echo/v4"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}
Leia mais »

Como injetar valores em variáveis com ldflags

Uma feature pouco conhecida para quem está iniciando na linguagem Go, é a capacidade de injetarmos valores em variáveis durante o processo de build. Embora possa parecer um tanto quanto estranho fazer isso, essa técnica nos possibilita adicionar informações como versão, data e commit do build, sem a necessidade de commitar essas informações. Embora possamos criar essas variáveis no mesmo arquivo onde estará a função main da aplicação, eu prefiro fazer algo que possa ser reutilizado.

Definindo as variáveis de build

Por isso, pensando em um repositório onde haverão várias aplicações, ou até mesmo em uma estrutura de monorepo, vamos criar um package dentro da pasta pkg chamado build. Dentro do package, vamos criar um arquivo chamado version.go com o seguinte conteúdo.

Leia mais »
Namespace Kubernetes

O que é e como criar Namespace no Kubernetes

Dando continuidade aos nossos posts sobre Kubernetes, vamos falar sobre Namespace.

Esse recurso do Kubernetes pode ser utilizado de diversas formas. Algumas pessoas criam namespaces para separar ambientes dentro de um mesmo cluster, enquanto outras preferem criar namespaces para cada time ou produto que a empresa tem.

Definindo Namespace

Independente do propósito, a finalidade dos namespaces sempre será a mesma, particionar o cluster em subdivisões lógicas.

Para ajudar com a imagem mental, imagine que namespaces são como pastas do seu computador, onde você pode definir qualquer divisão que quiser. No entanto, diferente de pastas, onde você consegue colocar uma dentro da outra, no caso dos namespaces, não existem “sub-namespaces”.

Leia mais »