O Go 1.18 chega com uma mudança que a comunidade pede há anos: suporte a código genérico por meio de tipos parametrizados.1 Para uma linguagem que sempre vendeu simplicidade, compilação rápida e um conjunto pequeno de conceitos, a entrada de generics não é apenas acréscimo sintático. É uma negociação delicada entre expressividade e legibilidade.
O release também traz fuzzing integrado ao go test, modo workspace para trabalhar com múltiplos módulos e uma série de ajustes de runtime e biblioteca padrão.2 Ainda assim, a conversa inevitavelmente começa pelos generics, porque eles alteram a forma como bibliotecas, coleções, utilitários e SDKs podem ser desenhados.
Generics entram sem abandonar o contrato do Go
Go evitou generics por muito tempo porque a linguagem sempre priorizou leitura direta, ferramentas simples e um modelo de código que equipes diversas conseguem manter. O resultado foi uma cultura de repetição moderada, interfaces pequenas e geração de código em alguns casos. Com 1.18, parte dessa pressão diminui.
Funções e tipos passam a poder receber parâmetros de tipo. Isso permite escrever estruturas reutilizáveis sem sacrificar checagem estática nem recorrer a interface{} de forma ampla. Bibliotecas de slices, sets, caches, filas e validações ganham um caminho mais claro para expressar intenção.
A mudança também exige disciplina. Generics podem reduzir duplicação, mas também podem criar APIs abstratas demais. O melhor uso no Go tende a aparecer onde há ganho real de tipo, teste e manutenção. Se o código genérico exige mais esforço para entender do que a repetição que substitui, a simplicidade original da linguagem foi perdida.
Fuzzing leva teste para entradas inesperadas
O fuzzing integrado é outro ponto relevante para produção. Em vez de depender apenas de testes com exemplos conhecidos, o go test passa a conseguir explorar entradas geradas automaticamente para encontrar falhas, panics e comportamentos inesperados.2
Isso conversa diretamente com segurança e confiabilidade. Parsers, validadores, codecs, APIs que recebem payload externo e bibliotecas de infraestrutura se beneficiam de testes que pressionam bordas do comportamento. O valor não está em substituir testes unitários, mas em complementar a cobertura com casos que humanos dificilmente escreveriam à mão.
Para equipes, a adoção precisa ser organizada. Fuzzing pode consumir tempo e revelar falhas profundas. É melhor começar por pacotes pequenos, com funções puras ou bem isoladas, e depois levar o padrão para camadas mais sensíveis.
Workspaces ajudam monorepos e módulos próximos
O modo workspace facilita trabalhar com múltiplos módulos Go no mesmo ambiente. Isso importa para empresas que dividem SDKs, serviços, bibliotecas internas e ferramentas em repositórios ou módulos separados. Antes, testar mudanças coordenadas exigia substituições manuais em go.mod ou fluxos internos.
Com go.work, o desenvolvimento local fica mais previsível. Times conseguem evoluir bibliotecas e consumidores em conjunto, reduzindo atrito de integração sem abandonar o modelo de módulos.
Go 1.18 é uma versão grande porque muda possibilidades sem tentar transformar Go em outra linguagem. Generics, fuzzing e workspaces ampliam o alcance do ecossistema, mas o desafio continua o mesmo: escrever software simples o bastante para ser operado por anos.
- Go Blog, "Go 1.18 is released!", 15 mar. 2022. ↩
- Go Documentation, "Go 1.18 Release Notes", 15 mar. 2022. ↩