Maison  >  Article  >  développement back-end  >  Comment les retours nommés et normaux dans Go diffèrent-ils lorsqu'une fonction panique ?

Comment les retours nommés et normaux dans Go diffèrent-ils lorsqu'une fonction panique ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 08:18:09302parcourir

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

Pourquoi un retour normal cache une panique qu'un retour nommé fournit à l'appelant

Dans Go, les instructions de retour normales et nommées sont utilisées pour renvoyer les valeurs d'une fonction. Cependant, il existe une différence subtile dans leur comportement lorsqu'une fonction panique.

Dans un retour normal, les valeurs de retour sont initialisées à leurs valeurs zéro lorsque la fonction est appelée. Si la fonction panique avant d'atteindre une instruction return, les valeurs de retour restent à leurs valeurs zéro. Par exemple, si une fonction renvoie une valeur d'erreur, un retour normal retournera toujours nul si la fonction panique.

En revanche, les retours nommés permettent de modifier les valeurs de retour par des fonctions différées ou par la fonction elle-même avant la fonction revient à son appelant. Si une fonction nommée renvoie une panique, les fonctions différées peuvent modifier les valeurs de retour avant que la fonction ne revienne à son appelant.

Cette différence peut être illustrée par l'exemple suivant :

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)
}

La sortie de ce programme est :

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

Comme vous pouvez le voir, le retour nommé renvoie une erreur non nulle, tandis que le retour normal renvoie nul. En effet, la fonction de capture différée de la fonction NamedReturns modifie la valeur de retour de l'erreur avant que la fonction ne revienne à son appelant.

Ce comportement peut être utile pour gérer les erreurs de manière cohérente tout au long d'un programme. En utilisant des retours nommés, vous pouvez vous assurer que toutes les fonctions renvoient une erreur non nulle en cas de panique, même si la panique se produit avant que la fonction n'atteigne une instruction return.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn