- La próxima versión de Go 1.22 planea corregir un error común del rango de los bucles
for que ha causado problemas en producción en muchas empresas.
- El problema ocurre cuando se mantiene una referencia a la variable del bucle después de terminar la iteración y esta termina teniendo un nuevo valor no intencional.
- Este problema es común tanto en código Go concurrente como no concurrente, y ha sido difícil de identificar y corregir debido a la complejidad de analizar si una referencia a la variable sobrevive más allá de la iteración.
- Las herramientas existentes para identificar este tipo de errores a menudo producen falsos negativos o falsos positivos, lo que provoca cambios de código innecesarios o problemas que pasan desapercibidos.
- La corrección propuesta en Go 1.22 cambiará los bucles
for para que tengan alcance por iteración en lugar de alcance por bucle, eliminando este tipo de errores y la necesidad de herramientas imprecisas.
- Para mantener la compatibilidad hacia atrás, la nueva semántica solo se aplicará a los paquetes incluidos en módulos que declaren Go 1.22 o superior en el archivo
go.mod.
- Los desarrolladores podrán controlar cuándo cambia la semántica en paquetes específicos, y el código existente seguirá funcionando como hasta ahora.
- Go 1.21 incluye una vista previa del cambio de alcance que puede activarse configurando
GOEXPERIMENT=loopvar en el entorno.
- Este cambio ha sido probado ampliamente en Google y no se han reportado problemas en código de producción.
- Sin embargo, algunas pruebas afectadas por el problema de las variables del bucle tuvieron que corregirse porque no estaban probando originalmente lo que pretendían probar.
- El analizador
loopclosure de Go 1.21 ha mejorado para identificar y reportar este tipo de problemas, ayudando a los desarrolladores a prepararse para el cambio en Go 1.22.
- Se puede encontrar información más detallada sobre este cambio en el documento de diseño y en las preguntas frecuentes.
1 comentarios
Comentarios en Hacker News
for loopsenGo 1.22, con enfoque en el uso incorrecto de variables de bucle en cierres