¿Puede la recuperación de pánico modificar las variables locales en los literales de funciones?
en Go, cuando se trabaja con valores de retorno nombrados, puede usar una instrucción de deferta para modificar los valores antes de devolverlos. Sin embargo, este comportamiento no es consistente cuando se usa variables locales en literales de funciones.
Considere el siguiente código:
func foo() (result int, err error) {
defer func() {
if e := recover(); e != nil {
result = -1
err = errors.New(e.(string))
}
}()
bar()
result = 100
err = nil
return
}
func bar() {
panic("panic happened")
}
Este código funciona como se esperaba, configurando el resultado en -1 y err a un mensaje de error personalizado después de recuperarse de un pánico. Sin embargo, si usamos variables locales dentro de la función literal, el comportamiento cambia:
func foo() (int, error) {
var result int
var err error
defer func() {
if e := recover(); e != nil {
result = -1
err = errors.New(e.(string))
}
}()
bar()
result = 100
err = nil
return result, err
}
func bar() {
panic("panic happened")
}
En este caso, el resultado se restablece a 0 en lugar de -1. Esto se debe a que la declaración de diferir en la función literal no puede acceder o modificar los valores de retorno nombrados ya que ya no están en el alcance.
Según la documentación de GO, "... Si la función diferida es una función literal y la función circundante ha nombrado parámetros de resultados que están en el alcance dentro de la literal, la función defired puede acceder y modificar los parámetros de resultados antes de que regresen. Es crucial usar valores de retorno con nombre al intentar modificarlos usando una declaración de diferir dentro de una función literal. No se pueden acceder o modificar variables locales en tales casos.
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