1 puntos por GN⁺ 2023-09-20 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2023-09-20
Comentarios en Hacker News
  • Debate sobre el problema de los for loops en Go 1.22, con enfoque en el uso incorrecto de variables de bucle en cierres
  • El problema del uso incorrecto de variables de bucle en cierres no es nuevo y se remonta al lenguaje Lisp en 1992
  • El equipo del lenguaje C# también se enfrentó a este problema e implementó un cambio importante en C# 5.0 para resolverlo
  • Go 1.21 no compila código que declara posterioridad a Go 1.22, lo que garantiza que el código que depende de la nueva semántica no se compile con la semántica antigua
  • Hay preocupación sobre si este cambio podría romper programas que dependen del comportamiento actual
  • Algunos usuarios se preguntan cómo funcionará realmente si un paquete fija 1.22 y el usuario compila con 1.18
  • También hay preguntas sobre el impacto de este cambio en la asignación de memoria y el rendimiento de los bucles
  • Algunos usuarios comparten experiencias con problemas similares en otros lenguajes, como Python
  • El cambio de Go 1.22 parece una forma de resolver un problema de sintaxis del lenguaje, pero a algunos usuarios les resulta poco intuitivo porque hay que saber la versión declarada en un archivo para entender el comportamiento de otro archivo