处理 Go 中返回值错误的延迟函数
当返回变量的函数在没有延迟的情况下被延迟时,gometalinter 和 errcheck 正确地发出警告检查其返回的错误。这可能会导致未处理的错误和潜在的运行时问题。
处理这种情况的习惯用法不是推迟函数本身,而是将其包装在另一个检查返回值的函数中。这是一个例子:
defer func() {
if err := r.Body.Close(); err != nil {
// Handle the error
}
}()
通过使用匿名函数,您可以捕获延迟函数的返回值并处理发生的任何错误。
或者,您可以创建一个辅助函数来简化该过程:
func Check(f func() error) {
if err := f(); err != nil {
// Handle the error
}
}
此辅助函数可用于延迟多个函数,确保检查它们的返回值:
defer Check(r.Body.Close)
defer Check(SomeOtherFunc)
您甚至可以扩展辅助函数以接受多个函数:
func Checks(fs ...func() error) {
for i := len(fs) - 1; i >= 0; i-- {
if err := fs[i](); err != nil {
// Handle the error
}
}
}
这允许您推迟多个函数并以更简洁和有组织的方式处理它们的错误:
defer Checks(r.Body.Close, SomeOtherFunc)
为了确保以正确的顺序处理错误,Checks() 函数使用向下循环以与声明相反的顺序执行函数。这与延迟函数的执行顺序一致,最后一个延迟函数首先执行。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3