Единственная возможная модификация стека defer
- это «вытолкнуть» его.
Сказав это, вы можете сделать опцию отсрочкой необязательной с переменной для досрочного выхода из отложенной функции.Пример:
func foo() {
var skipDefer bool
defer func() {
if skipDefer {
return
}
// Do body of defer
}()
// Do stuff
if someConditionIsTrue {
skipDefer = true
}
defer func() {
// Do this one unconditionally
}
// Do other stuff
}
Вы также можете управлять списком функций, которые будут выполняться вручную, если вы действительно хотите:
func foo() {
var deferreds []func()
defer func() {
for _, f := range deferreds {
f()
}
}()
// Add to and arrange `deferreds` to your heart's content
}