A grande mudança na recém lançada versão 1.9 do Go é o avanço no suporte para a melhoria de código através da utilização da declaração de alias de tipos. A nova versão também traz melhorias no garbage collector e no compilador.
A melhoria gradual de código (gradual code repair), conforme explicação do engenheiro do Google Russ Cox, é uma abordagem bastante útil para a realização de refactoring, especialmente em uma grande base de código. Em resumo, a melhoria gradual de código auxilia a realização de um grande refactoring em uma série de passos, ou melhor, commits ao invés de se fazer todas as mudanças automaticamente, em um único commit.
Em um nível conceitual, o atomic refactor é geralmente mais simples, mas que pode gerar grandes commits em bases de código maiores deixando o processo de revisão e merge mais complicado. Ao utilizar o gradual code repair, o refactoring acontece em 3 passos:
- Primeiro, você adiciona a nova API, que deve ser capaz de coexistir com a antiga API. Dessa forma, você não precisa alterar todas as chamadas para a antiga API de uma única vez.
- Segundo, você modifica todas as chamadas para a antiga API para a nova API.
- Finalmente, você pode remover a antiga API.
Para habilitar a melhoria gradual de código, devem ser criados nomes alternativos para constantes, funções, variáveis e tipos. Com a nova versão, o Go permite a definição de alias de tipos utilizando uma declaração como:
type OldAPI = NewPackage.API
Isso pode ser utilizado para fazer todas as referências para OldAPI utilizar o novo tipo automaticamente. Para uma discussão mais ampla a respeito do gradual code repair, não deixe de conferir a explicação completa de Russ Cox.
Conforme explicação de um outro desenvolvedor do Google, Francesc Campoy, a maior parte do esforço para o Go 1.9 foi direcionado a realização de melhorias no runtime, bibliotecas do core e tooling. As mudanças mais significativas são:
- Na nova versão, o garbage collector do Go tem uma melhor performance graças ao número de funções do próprio Go disparando o garbage collection de forma concorrente, bloqueando somente a chamada do goroutine e não toda a execução. Além disso, a alocação heap de objetos grandes também teve uma melhora significativa.
- O compilador do Go 1.9 está apto a compilar funções que pertençam à mesma package em paralelo. Isso melhora a compilação em paralelo de packages separadas, o que já estava disponível em versões anteriores do compilador.
- Nas bibliotecas core, a versão 1.9 do Go torna o uso da package time segura graças ao monotonic time tracking. Isso torna mais fácil a comparação com valores Time mesmo na ocorrência de sincronizações de relógios. Além disso, no novo tipo Map da package sync permite mapas concorrentes operando em thread-safe com carregamento, armazenamento e remoção constant-time.
Para ficar por dentro de todas as mudanças que vieram com o Go 1.9, faça a leitura completa do release notes oficial.