Maison développement back-end Golang Comment la fonction de récupération dans la fonction Golang est-elle implémentée ?

Comment la fonction de récupération dans la fonction Golang est-elle implémentée ?

Jun 05, 2024 pm 03:15 PM
golang 恢复

La fonction de récupération dans le langage Go est implémentée via le planificateur pour gérer l'enregistrement de panique dans la goroutine, qui est utilisée pour capturer et gérer les erreurs inattendues. Il capture uniquement la panique dans la goroutine actuelle et utilise l'instruction defer pour exécuter la fonction de récupération avant le retour de la fonction. La fonction de récupération reçoit la valeur de panique de type interface{} et imprime un message d'erreur plus convivial.

Comment la fonction de récupération dans la fonction Golang est-elle implémentée ?

Comment la fonction de récupération dans la fonction Go est implémentée

La fonction recover dans le langage Go permet de récupérer de la panique suite à l'exécution de goroutine. Il est très utile pour détecter et gérer les erreurs inattendues. recover 函数允许从正在运行的 goroutine 中恢复 panic。它在捕获和处理意外错误方面非常有用。

实现

recover 的实现基于 Go 语言的调度程序。调度程序负责管理 goroutine 的执行。它维护着一个 panic 记录,其中存储了最新发生的 panic 值。

当 panic 发生时,调度程序将 panic 值保存在 panic 记录中,并终止当前正在执行的 goroutine。然后,它将控制权交给将该 goroutine 标记为 "dead" 的 runtime。

如果其他 goroutine 正在等待该 goroutine 退出,它们将收到一个 Recover 消息。该消息包含 panic 记录中的 panic 值。

实战案例

假设我们有一个可能引发 panic 的函数:

1

2

3

4

5

6

func DivideByZero(x, y int) {

    if y == 0 {

        panic("division by zero")

    }

    fmt.Println(x / y)

}

Copier après la connexion

我们可以使用 recover 从 panic 中恢复,并打印一个更友好的错误消息:

1

2

3

4

5

6

7

8

9

func main() {

    defer func() {

        if err := recover(); err != nil {

            fmt.Println("Error:", err)

        }

    }()

 

    DivideByZero(10, 0)

}

Copier après la connexion

输出:

1

Error: division by zero

Copier après la connexion

注意

  • defer 语句用于在函数返回之前运行恢复函数。
  • 恢复函数是一个匿名函数,它需要一个 interface{}
  • implémentation
🎜recover est basé sur le planificateur de langage Go. Le planificateur est chargé de gérer l’exécution des goroutines. Il conserve un enregistrement de panique, qui stocke la dernière valeur de panique. 🎜🎜Lorsqu'une panique se produit, le planificateur enregistre la valeur de panique dans l'enregistrement de panique et met fin à la goroutine en cours d'exécution. Il confie ensuite le contrôle au runtime qui marque la goroutine comme "morte". 🎜🎜Si d'autres goroutines attendent la sortie de cette goroutine, ils recevront un message Récupérer. Le message contient la valeur de panique de l'enregistrement de panique. 🎜🎜🎜Cas pratique🎜🎜🎜Supposons que nous ayons une fonction qui peut provoquer une panique : 🎜rrreee🎜Nous pouvons utiliser recover pour récupérer de la panique et afficher un message d'erreur plus convivial : 🎜rrreee🎜Sortie :🎜rrreee🎜🎜Remarque 🎜🎜
    🎜L'instruction defer est utilisée pour exécuter la fonction de récupération avant le retour de la fonction. 🎜🎜La fonction de récupération est une fonction anonyme qui nécessite un paramètre de type interface{} pour recevoir la valeur de panique. 🎜🎜La fonction de récupération ne capture que les paniques dans la goroutine actuelle. Il ne peut pas détecter les paniques dans les autres goroutines. 🎜🎜

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 de ce site Web
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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Jun 06, 2024 am 11:21 AM

Comment configurer le pool de connexions pour la connexion à la base de données Golang ?

Comment lire et écrire des fichiers en toute sécurité avec Golang ? Comment lire et écrire des fichiers en toute sécurité avec Golang ? Jun 06, 2024 pm 05:14 PM

Comment lire et écrire des fichiers en toute sécurité avec Golang ?

Similitudes et différences entre Golang et C++ Similitudes et différences entre Golang et C++ Jun 05, 2024 pm 06:12 PM

Similitudes et différences entre Golang et C++

Quelle est la courbe d'apprentissage de l'architecture du framework Golang ? Quelle est la courbe d'apprentissage de l'architecture du framework Golang ? Jun 05, 2024 pm 06:59 PM

Quelle est la courbe d'apprentissage de l'architecture du framework Golang ?

Comment générer des éléments aléatoires à partir d'une liste dans Golang ? Comment générer des éléments aléatoires à partir d'une liste dans Golang ? Jun 05, 2024 pm 04:28 PM

Comment générer des éléments aléatoires à partir d'une liste dans Golang ?

Comparaison des avantages et des inconvénients du framework Golang Comparaison des avantages et des inconvénients du framework Golang Jun 05, 2024 pm 09:32 PM

Comparaison des avantages et des inconvénients du framework Golang

Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Jun 05, 2024 pm 10:39 PM

Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ?

instructions d'utilisation du document cadre Golang instructions d'utilisation du document cadre Golang Jun 05, 2024 pm 06:04 PM

instructions d'utilisation du document cadre Golang

See all articles