


Quelle est la gamme d'environnements contenus dans une fermeture ?
php La gamme environnementale contenue dans le milieu fermé fait référence aux éléments, facteurs et conditions contenus dans le milieu fermé. Un environnement fermé fait référence à un espace ou une plage relativement fermé et restreint, qui peut être un espace physique, tel qu'un laboratoire ou une usine, ou un espace virtuel, tel qu'un réseau informatique. Dans un environnement fermé, divers facteurs tels que la température, l'humidité, la composition des gaz, etc. peuvent être contrôlés et ajustés pour atteindre des objectifs spécifiques. Les environnements fermés sont courants dans les expériences de recherche scientifique, la production et la fabrication et dans d'autres domaines, et jouent un rôle important pour garantir la précision expérimentale et la qualité des produits.
Contenu de la question
J'ai imité des tutoriels en ligne sur les fermetures et j'ai écrit le code suivant.
func foo1() func() { xvalue := 1 x := &xvalue defer func() { xvalue = 2 }() return func() { *x = *x + 1 fmt.printf("foo1 val = %d\n", *x) } } func main() { f1 := foo1() f1() f1() f1() }
Je suis confus, lors de l'exécution f1 := foo1()
后,变量 xvalue
似乎应该被回收,因此使用 *x
cela devrait être faux, mais le code ci-dessus ne contient aucune erreur et s'exécute correctement, donnant le résultat
foo1 val = 3 foo1 val = 4 foo1 val = 5
Je veux donc savoir si la fermeture enregistre la valeur du pointeur en plus du pointeur lui-même, ou est-ce que le mécanisme de garbage collection du langage go empêche la suppression de la valeur x ?
Solution de contournement
Dans Go, une fermeture obtient une référence à (l'adresse de) toute variable qu'elle ferme. Citation Référence linguistique :
Les littéraux de fonction sont des fermetures : ils peuvent référencer des variables définies dans les fonctions environnantes. Ces variables sont ensuite partagées entre les fonctions environnantes et les littéraux de fonction, et elles persistent tant qu'elles sont accessibles.
Donc, dans votre exemple :
-
f1 := foo1()
- Faire exister la variable
xValue
(le compilateur peut l'allouer sur le tas). Il commencera avec une valeur nulle de 0 pour son type. - Faites exister la variable
x
存在并为其分配xValue
et attribuez-lui l'adresse de . -
La fermeture
defer
-red 闭包运行并将值 2 分配给xValue
defer
-rouge s'exécute et attribue la valeur 2 à . -
x
Renvoie une variable de fermeture de fermeture .
x
,编译器保证即使在foo
返回后该变量也存在。由于x
包含xValue
Ce dernier point peut être un peu délicat : puisque la fermeture renvoyée fait référence à la variablexValue
, le compilateur garantit que la variable existe même après le retour defoo
. Puisque (et est donc une référence en direct à celle-ci), cette adresse existe toujours et ne peut pas être récupérée.
En utilisant la même méthode d'analyse d'échappement, le compilateur garantit que - Faire exister la variable
- survit au retour de sa fonction déclarée.
xValue
Vous exécutez la fermeture renvoyée, qui est modifiée par le pointeur vers celle-ci
🎜 🎜Pour résumer, peut-être que vous trébuchez sur les connaissances C++, une fois le contrôle renvoyé par la fonction, toute variable déclarée dans la fonction n'existe plus, donc toute référence à cette variable qui existe en dehors de la fonction devient invalide. Dans Go, ce n'est pas le cas : le langage est explicitement défini pour être sûr à cet égard : le compilateur garantit que toute variable a une allocation appropriée de sorte que lorsqu'une référence à celle-ci est renvoyée (ou autrement transmise) lors de sa création, la fonction appels. A partir de cette fonction, des appels sont effectués vers le monde extérieur. 🎜
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...
