Quelles sont les fonctions anonymes (fermetures) en Go?
Aug 01, 2025 am 06:47 AMLes fonctions anonymes dans GO sont des fonctions anonymes qui peuvent capturer des variables de leur portée entourée, devenant des fermetures; 1) Ils sont définis en ligne et peuvent être attribués à des variables ou transmis comme arguments; 2) Lorsqu'ils capturent les variables externes, ils forment des fermetures qui conservent l'accès à ces variables même après la sortie de la fonction extérieure; 3) Ils capturent les variables par référence, ce qui peut conduire à un comportement inattendu dans les boucles à moins que la variable ne soit transmise comme argument; 4) Ils sont utiles pour les fonctions d'usine, le middleware, l'exécution différée et les rappels; 5) Un exemple pratique est le middleware HTTP qui enveloppe les gestionnaires tout en préservant l'état à travers des variables capturées, permettant un code propre et modulaire.
Les fonctions anonymes en Go - souvent appelées fermetures - sont des fonctions qui ne sont pas déclarées avec un nom. Au lieu de cela, ils sont définis en ligne et peuvent être affectés à des variables, passés comme arguments ou retournés d'autres fonctions. Lorsqu'une fonction anonyme capture des variables de sa portée entourée, elle devient une fermeture .

Qu'est-ce qui rend une fonction "anonyme"?
Une fonction anonyme est simplement une fonction sans nom. Voici un exemple de base:
func () { fmt.println ("Bonjour à partir d'une fonction anonyme!") } ()
Cette fonction est définie et immédiatement invoquée (notez le ()
à la fin). Il n'a pas de nom, mais c'est toujours une fonction à part entière.

Fermetures: capturer les variables de la portée extérieure
La véritable puissance survient lorsqu'une fonction anonyme accède aux variables définies en dehors de son propre corps. Lorsqu'il le fait, il forme une fermeture - une fonction qui "ferme" les variables "de son environnement environnant.
Exemple:

func counter () func () int { Compter: = 0 return func () int { compter Return Count } } // utilisation Suivant: = Counter () fmt.println (next ()) // 1 fmt.println (next ()) // 2 fmt.println (next ()) // 3
Ici:
-
counter()
Renvoie une fonction anonyme. - Cette fonction capture la variable
count
à partir de la portée extérieure. - Même après la fin de
counter()
,count
persiste parce que la fermeture lui fait référence.
Ce comportement est essentiel pour créer des fonctions avec état sans utiliser de variables globales.
Points clés sur les fermetures en Go
- Ils capturent les variables par référence , et non par valeur. Cela signifie que si vous référez une variable dans une boucle, soyez prudent - il peut ne pas vous comporter comme prévu:
pour i: = 0; i <3; je { différer func () { fmt.println (i) // imprimera 3, 3, 3 } () }
Pour résoudre ce problème, passez la variable comme argument:
pour i: = 0; i <3; je { différer la func (val int) { fmt.println (val) // imprimera 0, 1, 2 }(je) }
- Les fermetures sont utiles pour :
- Fonctions d'usine (comme l'exemple
counter
) - Décorateurs de fonction / middleware (commun dans les gestionnaires HTTP)
- Exécution retardée avec un état capturé (
defer
,time.AfterFunc
) - Implémentation de rappels
- Fonctions d'usine (comme l'exemple
Cas d'utilisation pratique: middleware HTTP
func loggingmiddleware (suivant http.handlerfunc) http.handlerfunc { return func (w http.ResponseWriter, r * http.request) { fmt.printf ("Demande:% s% s \ n", R.Method, R.url.path) Suivant (W, R) } }
Cela renvoie une fermeture qui enveloppe le gestionnaire d'origine, ajoutant la journalisation tout en préservant l'accès à next
.
Donc, en bref:
Les fonctions anonymes sont des fonctions anonymes.
Lorsqu'ils capturent des variables externes, ils deviennent des fermetures.
Et ils sont un outil puissant pour écrire du code GO Clean et modulaire.
Fondamentalement, ils laissent les fonctions porter leur environnement avec eux. Pas magique - juste la portée intelligente.
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

Undress AI Tool
Images de déshabillage gratuites

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.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

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)

Sujets chauds

Le moteur de modèle de Go fournit des capacités de génération de contenu dynamiques puissantes via des packages de texte / modèle et HTML / modèle, où HTML / modèle a une fonction d'échappement automatique pour empêcher les attaques XSS, de sorte qu'elle doit être utilisée en premier lors de la génération de HTML. 1. Utilisez {{}} Syntaxe pour insérer des variables, des jugements conditionnels et des boucles, tels que {{.FieldName}} pour accéder aux champs de structure, {{if}} et {{range}} pour implémenter un contr?le logique. 2. Le modèle prend en charge les structures de données GO telles que la structure, la tranche et la carte, et le point dans la plage représente l'élément itératif actuel. 3. Le modèle nommé peut être défini par définir et réutilisé avec la directive de modèle. 4.ht

Lors de la transmission de tranches, il est généralement transmis directement par valeur, car l'en-tête de tranche contient un pointeur vers le tableau sous-jacent et la copie de l'en-tête de tranche ne copiera pas les données sous-jacentes, de sorte que la modification des éléments de la fonction affectera la tranche d'origine; 1. Si vous devez réaffecter ou ajuster la longueur de la tranche dans la fonction et rendre le changement, vous devez passer le pointeur de tranche; 2. Sinon, vous pouvez passer la tranche directement sans utiliser de pointeur; 3. Si la réallocation peut être déclenchée lors de l'utilisation de l'ajout, vous devez passer par le pointeur pour rendre la tranche mise à jour visible vers l'extérieur. Par conséquent, à moins que la tranche entière ne soit remplacée, la tranche doit être transmise sous la forme d'une valeur.

L'intégration GO et Kafka est une solution efficace pour créer des systèmes de données en temps réel haute performance. La bibliothèque client appropriée doit être sélectionnée en fonction des besoins: 1. La priorité est donnée à Kafka-Go pour obtenir des API de style go simple et un bon soutien de contexte, adapté à un développement rapide; 2. Sélectionnez Sarama lorsque des fonctions de contr?le fin ou avancées sont nécessaires; 3. Lors de la mise en ?uvre des producteurs, vous devez configurer l'adresse du courtier, le thème et la stratégie d'équilibrage de chargement et gérer les délais d'expiration et les fermetures à travers le contexte; 4. Les consommateurs doivent utiliser des groupes de consommateurs pour atteindre l'évolutivité et la tolérance aux défauts, soumettre automatiquement les décalages et utiliser raisonnablement un traitement simultané; 5. Utilisez JSON, AVRO ou Protobuf pour la sérialisation, et il est recommandé de combiner Schemaregist

GOVETCATCHESCOMMONLOGICICALES ENRREURS ENCORSSEMBLES ACCUSTRUCTIONSE

Pour intégrer le contenu du fichier dans la cha?ne du programme GO, vous devez utiliser Go: Embed (go1.16) pour intégrer le fichier au moment de la compilation; 1. Ajouter la directive // GO: intégrer au-dessus de la variable cible; 2. Assurez-vous que le chemin du fichier est correct et que le fichier existe; 3. Utilisez des variables de type de cha?ne pour recevoir du contenu texte; 4. Créez le projet via Gobuild pour inclure le contenu du fichier. Cette méthode est s?re et efficace et ne nécessite pas d'outils supplémentaires, et implémente finalement le contenu du fichier directement dans le fichier binaire sous forme de cha?nes.

Usereflect.valueofAndreflect.TypeoftoGetTimeValuesAndTypes; 2.InspectTypedetailsWithReflect.TypeMethodslikename () etkind (); 3.ModifyValuesviAreflect.Value.Elem () etCanSet () AfterPassingApointer; 4.CallMethodsDynamiquement UsingMethodByName () etCall (); 5.R

Dans le langage GO, le middleware HTTP est implémenté via des fonctions, et sa réponse principale est: le middleware est une fonction qui re?oit et renvoie http.handler, utilisé pour exécuter la logique générale avant et après le traitement de la demande. 1. La signature de la fonction middleware est comme Func (middleware (nexthttp.handler) http.handler), qui atteint l'expansion fonctionnelle en emballage le processeur d'origine; 2. Le middleware logarithmique dans l'exemple enregistre la méthode de demande, le chemin d'accès, l'adresse du client et le temps qui prend du temps, ce qui est pratique pour le suivi et le débogage; 3. Le middleware d'authentification vérifie l'en-tête d'autorisation et renvoie les erreurs 401 ou 403 lorsque la vérification ne garantit pas l'accès sécurisé; 4. Plusieurs middleware peuvent être imbriqués pour ajuster

UseContext.WithTimeoutTocreatEacancelLableContextwithAdeadLineAndalwaysCallCancel () ToreleSeResources.2.ForHttpRequests, settimeoutsinghttp.client.timeoutoruseContextViahttp.NewRequestwithContel
