如何轻轻推迟执行可能返回错误的函数?

Ali*_*rus 3 go

大多数清理功能,特别是那些与IO操作相关的功能,返回一个error,通常我们更喜欢defer执行它们,以防我们在完成获取的资源时忘记调用它们.例如,在代码中的某些时候我们可能会写这样的东西:

var r *SomeResource
var err error
if r, err = Open(/* parameters */); err != nil {
    return nil, err
}
defer r.Close() // This might return an error
Run Code Online (Sandbox Code Playgroud)

似乎如果Close函数返回错误,它将被忽略.我们如何轻柔地处理error从这样的功能返回?

Sea*_*ays 7

使用defer具有func() {}()像这样.

var r *SomeResource
var err error
if r, err = Open(/* parameters */); err != nil {
    return nil, err
}
defer func() {
    if err = r.Close(); err != nil {
        fmt.Printf("ERROR: %v", err)
    }
}()
Run Code Online (Sandbox Code Playgroud)