Go 中延迟返回
在 Go 中,defer 语句允许推迟函数的执行,直到周围的函数返回。这允许即使在发生紧急情况时也能执行清理任务,这种情况在运行时发生不可恢复的错误时可能会发生。
考虑以下代码片段,如果函数发生紧急情况,它会尝试从函数返回错误:
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err } }() panic("Report format not recognized.") // rest of the getReport function }
但是,此代码无法按预期工作。 deferred函数内的return语句只是修改了函数内的局部变量err和rep,并没有真正将它们返回到函数外。
为了解决这个问题,我们可以使用deferred函数内的recover函数来检索恐慌值并相应地设置 err 参数。此外,我们应该检查恐慌值的类型,并在必要时将其转换为错误。
这是更新的代码:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } rep = nil } }()
此代码确保 err 参数设置为基于恐慌值的适当错误,并且它还会使rep参数无效以防止返回不完整的报告。
以上是如何处理 Go 函数中的恐慌和延迟返回?的详细内容。更多信息请关注PHP中文网其他相关文章!