Go 1.26.2: Patches de Segurança

Go 1.26.2 foi lançado em 7 de abril com patches críticos de segurança no compilador, crypto/tls, crypto/x509, html/template e os. Neste post, vamos entender por que essa atualização é importante e como você pode acompanhar esses advisories de forma proativa.

Por que atualizar para Go 1.26.2?

Atualizar rapidamente quando patches de segurança saem é uma das coisas mais importantes que você pode fazer como engenheiro. Não estou falando de features novas — estou falando de brechas de segurança que podem comprometer toda a sua infraestrutura.

Go publica patches de segurança em ciclos regulares, e quando saem, é porque uma vulnerabilidade real foi descoberta e já está documentada. Esperar “até o próximo ciclo” é arriscar demais.

Leia mais »
goroutine leaks no go 1.26

Detectando goroutine leaks no Go 1.26

Se você já trabalhou com Go em produção, provavelmente já enfrentou aquele cenário: goroutines que ficam presas para sempre, consumindo memória sem nunca terminar. O Go 1.26 trouxe uma ferramenta experimental que ataca esse problema direto na raiz: o goroutine leak profile.

O que são goroutine leaks?

Uma goroutine leak acontece quando uma goroutine fica bloqueada permanentemente — esperando em um channel, mutex ou condition variable que nunca vai ser desbloqueado. Na prática, é memória e recursos que ficam presos sem possibilidade de liberação.

O cenário mais clássico: você cria uma goroutine que escreve em um channel sem buffer, mas a função que deveria ler esse channel retorna antes por conta de um erro. A goroutine fica ali, bloqueada para sempre.

Leia mais »

Entendendo o Green Tea GC do Go 1.26

Go 1.26 trouxe uma das maiores mudanças no runtime dos últimos anos: o Green Tea garbage collector agora vem habilitado por padrão. Nesse post, vamos entender o que mudou, por que isso importa e o que esperar na prática.

O que é o Green Tea GC?

O Green Tea GC é uma reformulação do garbage collector do Go. Ele mantém a mesma abordagem mark-sweep do GC anterior, mas muda fundamentalmente a forma como os objetos são rastreados e escaneados.

A diferença principal: em vez de operar objeto por objeto espalhado pelo heap, o Green Tea trabalha no nível de páginas de memória. Ele agrupa objetos em blocos contíguos de 8 KiB chamados spans e escaneia vários objetos de uma vez dentro do mesmo span.

Leia mais »

Como Go 1.25 e 1.26 reduzem a pressão no GC

Nesse post, vamos entender uma das otimizações mais interessantes das últimas versões do Go: a capacidade do compilador de alocar slices na stack em mais cenários — sem você precisar mudar uma linha de código.

O problema: heap allocation e o GC

Em Go, cada variável precisa ser alocada em algum lugar: na stack (pilha) ou na heap. A stack é rápida — alocar e liberar memória lá é praticamente gratuito. Já a heap é gerenciada pelo garbage collector, o que tem um custo: quanto mais você aloca no heap, mais trabalho o GC tem para fazer.

O compilador do Go usa uma técnica chamada escape analysis para decidir onde cada variável vai parar. Se ele consegue provar que uma variável não vai “escapar” do escopo da função, ele a coloca na stack. Caso contrário, ela vai para o heap.

O problema é que essa análise é conservadora: em muitos casos práticos, como acumular elementos em um slice dentro de um loop, o compilador não tinha certeza se o slice ia escapar ou não e alocava no heap por precaução.

Leia mais »

Atualizando seu código com go fix

O Go, desde suas primeiras versões, se preocupa com a evolução da linguagem sem quebrar código existente, e um dos comandos que ajuda muito nesse processo é o go fix.

Nesse post, vamos entender o que ele faz, quando utilizá-lo e como ele funciona na prática.

O que é o go fix?

O go fix é um comando da toolchain do Go que atualiza automaticamente o código-fonte para se adequar a mudanças de API introduzidas em novas versões da linguagem.

Ele funciona aplicando um conjunto de fixers — pequenas transformações automatizadas que identificam padrões de código antigos e os reescrevem para o equivalente moderno.

go fix ./...

Simples assim. O comando percorre todos os pacotes do módulo e aplica as correções necessárias.

Leia mais »

Gerenciando ferramentas com go tool

A versão 1.24 do Go trouxe diversas melhorias significativas, incluindo suporte completo a aliases de tipos genéricos, aprimoramentos no desempenho do runtime e novas funcionalidades no sistema de módulos.

Entre essas novidades, destaca-se a introdução do comando go tool, que simplifica o gerenciamento de dependências de ferramentas auxiliares, como linters e geradores de código, diretamente no arquivo go.mod.

Nesse post, vamos ver como utilizar esse novo comando e como essa mudança elimina a necessidade de soluções alternativas anteriormente utilizadas para rastrear ferramentas como linters e geradores de código.

Como Era Antes

Antes do Go 1.24, gerenciar ferramentas auxiliares em projetos Go exigia abordagens não oficiais.

Leia mais »

Melhores práticas para tratar erros em Go

O tratamento de erros é um aspecto fundamental do desenvolvimento de software, garantindo que suas aplicações lidem adequadamente com situações inesperadas.

Em Go, o gerenciamento de erros é tratado de forma explícita e diferenciada quando comparado a outras linguagens populares como Java, Python ou JavaScript. Esse design deliberado busca tornar os erros mais visíveis e gerenciáveis, mas também exige atenção especial por parte dos desenvolvedores para evitar armadilhas comuns.

Neste post, vamos explorar as melhores práticas para tratamento de erros em Go, garantindo que suas aplicações permaneçam robustas, legíveis e fáceis de manter.

Tratamento de Erros em Go

A maneira como o Go lida com erros difere significativamente do tradicional mecanismo de try/catch encontrado em outras linguagens de programação.

Em vez de capturar exceções, o Go utiliza um retorno explícito de erros nas funções. Esse design torna o erro parte da assinatura da função, forçando os desenvolvedores a reconhecer e lidar com os erros de forma explícita.

Leia mais »

Implementando CQRS com Go

No mundo do desenvolvimento de software, arquiteturas monolíticas e baseadas em CRUD (Create, Read, Update, Delete) têm sido amplamente utilizadas. No entanto, conforme as aplicações crescem em complexidade e demanda, essas abordagens podem se tornar limitadas, especialmente em termos de escalabilidade e separação de responsabilidades.

Nesse contexto surge o CQRS (Command Query Responsibility Segregation), um padrão arquitetural que separa as operações de escrita (commands) das operações de leitura (queries).

O que é CQRS

CQRS é um padrão que propõe a separação das responsabilidades de leitura e escrita de uma aplicação. Em um sistema tradicional, uma única camada de aplicação é responsável tanto por manipular dados quanto por recuperá-los. Com CQRS, essa responsabilidade é dividida em duas partes:

Leia mais »

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 »

Propagação de context

Propagar o mesmo context por toda uma aplicação pode fazer sentido em alguns casos, mas não é uma prática ideal ou recomendada para todas as situações. O context deve ser utilizado cuidadosamente e com objetivos específicos.

Nesse post, vamos explorar os cenários e cuidados ao se utilizar propagação de context.

O package context

O package context é parte da biblioteca padrão do Go e foi introduzido para resolver problemas relacionados ao gerenciamento de deadlines e cancelamentos em goroutines.

Ele fornece uma maneira de passar informações importantes, como limites de tempo e sinais de cancelamento, por meio de chamadas de funções e entre diferentes partes do código.

Para entender um pouco mais sobre esse package, recomendo a leitura dos posts:

Leia mais »