Manejo de funciones diferidas con valores de retorno erróneos en Go
gometalinter y errcheck generan con razón una advertencia cuando una función que devuelve una variable se difiere sin comprobando el error devuelto. Esto puede provocar errores no controlados y posibles problemas de tiempo de ejecución.
El modismo para manejar este escenario no es aplazar la función en sí, sino envolverla en otra función que verifique el valor devuelto. Aquí hay un ejemplo:
defer func() {
if err := r.Body.Close(); err != nil {
// Handle the error
}
}()
Al utilizar una función anónima, puede capturar el valor de retorno de la función diferida y manejar cualquier error que ocurra.
Alternativamente, puede crear una función auxiliar para simplificar el proceso :
func Check(f func() error) {
if err := f(); err != nil {
// Handle the error
}
}
Esta función auxiliar se puede utilizar para diferir múltiples funciones, asegurando que sus valores de retorno estén verificados:
defer Check(r.Body.Close)
defer Check(SomeOtherFunc)
Incluso puedes extender la función auxiliar para aceptar múltiples funciones:
func Checks(fs ...func() error) {
for i := len(fs) - 1; i >= 0; i-- {
if err := fs[i](); err != nil {
// Handle the error
}
}
}
Esto le permite aplazar múltiples funciones y manejar sus errores de una manera más concisa y organizada:
defer Checks(r.Body.Close, SomeOtherFunc)
Para garantizar que los errores se manejen en el orden correcto, la función Checks() utiliza un bucle descendente para ejecutar las funciones en orden inverso a su declaración. Esto se alinea con el orden de ejecución de las funciones diferidas, donde la última función diferida se ejecuta primero.
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