Я изучаю поведение defer в golang и хочу использовать его для обработки ошибок при возврате функции.
Код выглядит следующим образом:
package main
import "fmt"
import "errors"
func main() {
a()
}
func a() {
var err error
defer func(){
if err != nil {
fmt.Printf("1st defer: %s\n", err)
} else {
fmt.Println("1st defer: defer not error")
}
}()
defer func(err error){
if err != nil {
fmt.Printf("2nd defer: %s\n", err)
} else {
fmt.Println("2nd defer: defer not error")
}
}(err)
err = errors.New("new error")
if err != nil {
return
}
}
Выход:
2nd defer: defer not error
1st defer: new error
В Doc говорится, что параметры оцениваются при оценке вызова отсрочки, что, по-видимому, должно быть последовательный. Почему 2 defer имеет другое значение для переменной err
и, следовательно, другой вывод? Я знаю, что это связано со второй функцией, которая имеет err
в качестве входного параметра, но не знаю почему.