Home > Backend Development > Golang > How Do Named and Normal Returns in Go Differ When a Function Panics?

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

Linda Hamilton
Release: 2024-11-24 08:18:09
Original
361 people have browsed it

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

Why a Normal Return Hides a Panic that a Named Return Provides to the Caller

In Go, both normal and named return statements are used to return values from a function. However, there is a subtle difference in their behavior when a function panics.

In a normal return, the return values are initialized to their zero values when the function is called. If the function panics before reaching a return statement, the return values remain at their zero values. For example, if a function returns an error value, a normal return will always return nil if the function panics.

In contrast, named returns allow the return values to be modified by deferred functions or by the function itself before the function returns to its caller. If a function with named returns panics, deferred functions can modify the return values before the function returns to its caller.

This difference can be illustrated with the following example:

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)
}
Copy after login

The output of this program is:

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

As you can see, the named return returns a non-nil error, while the normal return returns nil. This is because the NamedReturns function's deferred catch function modifies the err return value before the function returns to its caller.

This behavior can be useful for handling errors in a consistent way throughout a program. By using named returns, you can ensure that all functions return a non-nil error if they panic, even if the panic occurs before the function reaches a return statement.

The above is the detailed content of How Do Named and Normal Returns in Go Differ When a Function Panics?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template