首页 >后端开发 >Golang >当函数发生紧急情况时,Go 中的命名返回和正常返回有何不同?

当函数发生紧急情况时,Go 中的命名返回和正常返回有何不同?

Linda Hamilton
Linda Hamilton原创
2024-11-24 08:18:09376浏览

How Do Named and Normal Returns in Go Differ When a Function Panics?

为什么普通返回隐藏了命名返回为调用者提供的恐慌

在 Go 中,普通返回和命名返回语句都会被使用从函数返回值。然而,当函数发生恐慌时,它们的行为存在细微的差异。

在正常返回中,当调用函数时,返回值被初始化为零值。如果函数在到达 return 语句之前发生恐慌,则返回值将保持为零值。例如,如果函数返回错误值,那么如果函数发生恐慌,正常返回将始终返回 nil。

相反,命名返回允许延迟函数或函数本身在之前修改返回值该函数返回到其调用者。如果具有命名返回值的函数发生恐慌,则延迟函数可以在函数返回到其调用者之前修改返回值。

可以通过以下示例说明这种差异:

package main

import (
    "fmt"
    "log"
)

func catch(err *error) {
    if r := recover(); r != nil {
        *err = fmt.Errorf("recovered panic: %v", r)
    }
}

func panicIf42(n int) {
    if n == 42 {
        panic("42!")
    }
}

func NormalReturns(n int) error {
    var err error
    defer catch(&err)
    panicIf42(n)
    return err
}

func NamedReturns(n int) (err error) {
    defer catch(&err)
    panicIf42(n)
    return
}

func main() {
    err := NamedReturns(42)
    log.Printf("NamedReturns error: %v", err)
    err = NormalReturns(42)
    log.Printf("NormalReturns error: %v", err)
}

输出这个程序的内容是:

2009/11/10 23:00:00 NamedReturns error: recovered panic: 42!
2009/11/10 23:00:00 NormalReturns error: <nil>

如你所见,命名返回返回一个非零错误,而正常返回返回零。这是因为 NamedReturns 函数的延迟 catch 函数会在函数返回到其调用者之前修改 err 返回值。

此行为对于在整个程序中以一致的方式处理错误非常有用。通过使用命名返回,您可以确保所有函数在发生恐慌时返回非零错误,即使恐慌发生在函数到达 return 语句之前。

以上是当函数发生紧急情况时,Go 中的命名返回和正常返回有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn