大多数清理功能,特别是那些与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从这样的功能返回?
使用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)