1 pontos por GN⁺ 2023-09-20 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2023-09-20
Opiniões do Hacker News
  • Discussão sobre o problema dos for loops no Go 1.22, com foco no uso incorreto da variável de loop em closures
  • O problema do uso incorreto da variável de loop em closures não é novo e remonta à linguagem Lisp em 1992
  • A equipe da linguagem C# também enfrentou esse problema e fez uma mudança significativa no C# 5.0 para resolvê-lo
  • O Go 1.21 não compila código que declara go 1.22 ou posterior, garantindo que código que depende da nova semântica não seja compilado com a semântica antiga
  • Há preocupação sobre se essa mudança pode quebrar programas que dependem do comportamento atual
  • Alguns usuários questionam como isso realmente funcionará se um pacote fixar 1.22 e o usuário compilar com 1.18
  • Também há perguntas sobre o impacto dessa mudança na alocação de memória e no desempenho de loops
  • Alguns usuários compartilham experiências com problemas semelhantes em outras linguagens, como Python
  • A mudança no Go 1.22 parece ser uma forma de corrigir um problema na sintaxe da linguagem, mas alguns usuários a consideram pouco intuitiva porque é preciso saber a versão declarada em um arquivo para entender o comportamento de outro arquivo