- O próximo lançamento do Go 1.22 planeja corrigir um erro comum no escopo de loops
for que causou problemas em produção em muitas empresas.
- O problema ocorre quando uma referência à variável do loop é mantida após o fim da iteração e acaba assumindo um novo valor não intencional.
- Esse problema é comum tanto em código Go concorrente quanto não concorrente, e tem sido difícil de identificar e corrigir por causa da complexidade de analisar se a referência à variável ultrapassa a iteração.
- As ferramentas atuais para identificar esses erros frequentemente geram falsos negativos ou falsos positivos, causando mudanças de código desnecessárias ou deixando problemas passarem despercebidos.
- A correção proposta no Go 1.22 mudará os loops
for para que tenham escopo por iteração em vez de escopo por loop, eliminando esse tipo de erro e a necessidade de ferramentas imprecisas.
- Para manter a compatibilidade retroativa, a nova semântica será aplicada apenas a pacotes incluídos em módulos que declarem Go 1.22 ou superior no arquivo
go.mod.
- Os desenvolvedores poderão controlar quando a semântica mudará em pacotes específicos, e o código existente continuará funcionando como hoje.
- O Go 1.21 inclui uma prévia dessa mudança de escopo, que pode ser ativada definindo
GOEXPERIMENT=loopvar no ambiente.
- Essa mudança foi amplamente testada no Google, sem problemas reportados em código de produção.
- No entanto, alguns testes afetados pelo problema da variável de loop, que não estavam testando o que originalmente pretendiam, precisaram ser corrigidos.
- O analisador
loopclosure do Go 1.21 foi aprimorado para identificar e reportar esse tipo de problema, ajudando os desenvolvedores a se prepararem para a mudança no Go 1.22.
- Mais informações sobre essa mudança podem ser encontradas no documento de design e no FAQ.
1 comentários
Opiniões do Hacker News
for loopsnoGo 1.22, com foco no uso incorreto da variável de loop em closuresgo 1.22ou posterior, garantindo que código que depende da nova semântica não seja compilado com a semântica antiga