Maison > développement back-end > Golang > Pourquoi les parenthèses sont-elles requises après la clôture des corps dans les déclarations différées de Go ?

Pourquoi les parenthèses sont-elles requises après la clôture des corps dans les déclarations différées de Go ?

Mary-Kate Olsen
Libérer: 2024-12-03 17:41:10
original
335 Les gens l'ont consulté

Why Are Parentheses Required After Closure Bodies in Go's Deferred Statements?

Invocations de fermeture dans Go

Dans Go, l'utilisation de parenthèses après le corps d'une fermeture ne se limite pas aux contextes de fermeture. Le concept de base qui régit ce comportement est que les expressions contenues dans des instructions différées doivent être des appels de fonction.

Littéraux de fonction avec fermetures

Considérons un littéral de fonction tel que func(ch chan int) { ch <- ACK }(), où les parenthèses suivent le corps de fermeture. Cette syntaxe enferme la fermeture dans un appel de fonction immédiatement invoqué. Cela permet à la fonction de s'exécuter lors de l'initialisation, en passant l'argument ReplyChan à la fermeture.

Déclarations différées

Dans les instructions différées, telles que defer func() { result } (), les parenthèses garantissent que l'expression incluse est un appel de fonction. Sans cette syntaxe, l'expression serait incomplète et ne constituerait pas un appel de fonction valide. La syntaxe des instructions différées exige donc que l'expression soit une invocation de fonction.

Orthogonalité avec les appels de fonction

Cette orthogonalité garantit la cohérence avec les appels de fonction en dehors des instructions différées. Par exemple, f(), où f est une valeur de fonction, représente une invocation de fonction qui renvoie une valeur. En revanche, f, sans parenthèses, représente la valeur de la fonction elle-même. Cette syntaxe parallèle s'applique également aux expressions dans les instructions différées.

Exécution de fermeture

Dans une fermeture définie dans une instruction différée, les parenthèses déterminent quand la fermeture s'exécutera. Par exemple, dans defer func() { fmt. Println(i) }(), la fermeture s'exécute immédiatement lorsque l'instruction defer est rencontrée, capturant la valeur actuelle de i. En revanche, defer func(n int) { fmt. Println(n) }(i) capture et imprime la valeur de i au moment de l'exécution de l'instruction defer, pas lorsque la fermeture s'exécute.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal