gpt4 book ai didi

golang 恢复返回值语法

转载 作者:IT王子 更新时间:2023-10-29 01:07:13 26 4
gpt4 key购买 nike

我正在尝试了解如何从 panic 情况中恢复过来。通常,像这样的事情会做:

 if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}

我能理解这么多。但我见过如下代码片段:

 if r, ok := recover().(error); ok {
fmt.Println("Recovered in f", r)
}

.(error) 部分在做什么?

最佳答案

这是一个 type assertion 检查是否 error recovered属于某种类型。

如果类型断言失败,则会导致运行时错误继续展开堆栈,就好像没有任何中断一样。

当您为错误定义本地 MyError 类型并且您只想从该类型恢复时,这很有用。

你可以在“Error handling and Go”中看到一个例子

Client code can test for a net.Error with a type assertion and then distinguish transient network errors from permanent ones.

For instance, a web crawler might:

  • sleep and retry when it encounters a temporary error
  • and give up otherwise.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
time.Sleep(1e9)
continue
}
if err != nil {
log.Fatal(err)
}

如果您有几种类型的错误想要恢复,您可以使用“Golang: returning from defer”中的类型开关

defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
// find out exactly what the error was and set err
switch x := r.(type) {
case string:
err = errors.New(x)
case error:
err = x
default:
// Fallback err (per specs, error strings should be lowercase w/o punctuation
err = errors.New("unknown panic")
}
// invalidate rep
rep = nil
// return the modified err and rep
}
}()

关于golang 恢复返回值语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25638842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com