从 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 // Attempt to return new values } }() panic("Report format not recognized.") // ... }
在此代码中, defer当发生恐慌时,函数尝试返回 nil 和 err。但是,这不起作用,因为延迟函数无法返回值。相反,返回的参数rep和err必须在defer函数中修改。
此外,代码中存在类型不匹配。恐慌发生在字符串上,而类型断言预计会出现错误。这将导致程序在尝试将恢复的值转换为错误时再次出现恐慌。
要修复代码,我们需要:
更正的代码:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
通过这些更改,defer 函数现在,当出现紧急情况时,可以正确设置 err 和 rep,从而允许调用函数适当地处理错误。
以上是Go 中的延迟函数可以返回值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!