Error de Scopelint: uso de variable en el alcance del rango
En una función de prueba TestGetUID, el código encuentra un error informado por Scopelint, que advierte contra usando la variable x del alcance del rango dentro de los literales de función.
Considere las siguientes líneas de código:
for _, x := range tests {
t.Run(x.description, func(t *testing.T) {
client := fake.NewSimpleClientset(x.objs...)
actual := getUID(client, x.namespace)
assert.Equal(t, x.expected, actual)
})
}
El error pertenece a estas líneas porque x es la variable de bucle dentro del bucle de rango que itera sobre el segmento de pruebas. Scopelint detecta que x se está utilizando en literales de función pasados a t.Run(), lo que podría generar problemas potenciales si los literales de función se invocan después de que t.Run() haya regresado.
Causa y Mejores prácticas
El problema surge porque el compilador no puede garantizar que los literales de función creados y pasados a t.Run() no se llamen después de que t.Run() salga. Si los literales de la función se llamaran después del retorno de t.Run(), se referirían a la variable x, que podría haberse sobrescrito con el valor de la iteración posterior del bucle.
Go vet genera esta advertencia para evitar dicho comportamiento no deseado, que puede provocar errores o incluso carreras de datos si los literales de función se ejecutan simultáneamente en diferentes gorutinas.
La mejor práctica recomendada en tales casos es pasar el valor de la variable de bucle al literal de función como argumento o para crear una copia de la variable de bucle y hacer referencia a la copia dentro del literal de función. Dado que la firma del literal de función no se puede cambiar, la solución recomendada es crear una copia, por ejemplo:
x2 := x
Después de declarar esta copia, el identificador x dentro del La función literal se referirá a la copia local, no a la variable de bucle. Aunque asignar el mismo nombre a la copia puede parecer confuso, indica claramente la intención de utilizar una copia.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3