«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Может ли восстановление паники изменить локальные переменные в функциональных литералах в Go?

Может ли восстановление паники изменить локальные переменные в функциональных литералах в Go?

Опубликовано в 2025-03-22
Просматривать:911

Can Panic Recovery Modify Local Variables in Function Literals in Go?

может ли паническим восстановлением изменять локальные переменные в литералах функции?

в Go, при работе с именованными возвращающими значениями вы можете использовать оператор DEFE, чтобы изменить значения, прежде чем их возвращать. Однако это поведение не является согласованным при использовании локальных переменных в литералах функции. defer func () { Если e: = record (); e! = nil { Результат = -1 err = errors.new (e. (String)) } } () бар() результат = 100 err = nil возвращаться } func bar () { Паника («Паника случилась») }

Этот код работает, как и ожидалось, настройка результата -1 и ошибки в пользовательском сообщении об ошибке после восстановления после паники. Однако, если мы используем локальные переменные в буквальном языке, поведение изменяется:

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")
}

В этом случае результат сброшен до 0 вместо -1. Это связано с тем, что оператор DEFER в функции литерала не может получить доступ или изменить именованные возвращаемые значения, поскольку они больше не находятся в области. Крайне важно использовать именованные возвращаемые значения при попытке изменить их, используя оператор DEFE в рамках буквальной функции. Локальные переменные в таких случаях не могут быть доступны или изменены.

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3