Maison > développement back-end > Golang > Pourquoi la fonction en ligne est-elle appelée immédiatement au lieu de simplement sa fonction contenant ?

Pourquoi la fonction en ligne est-elle appelée immédiatement au lieu de simplement sa fonction contenant ?

王林
Libérer: 2024-02-06 08:06:03
avant
1079 Les gens l'ont consulté

Pourquoi la fonction en ligne est-elle appelée immédiatement au lieu de simplement sa fonction contenant ?

Contenu de la question

Lors de l'attribution de valeurs aux champs de structure.

FlagSet: (func() *flag.FlagSet {
        fs := newFlagSet("configure")
        return fs
    })(),
Copier après la connexion

Je pense que cela équivaut à appeler newFlagSet("configure"). Quels sont les avantages d’écrire de cette manière.

Problèmes lors de la lecture du code source. Il faut savoir pourquoi il a écrit ça.


Bonne réponse


Recherche rapide, ce code vient de tailscale/tailscale, cmd/tailscale/cli/configure.go#var configureCmd = &ffcli.Command{}

var configureCmd = &ffcli.Command{
    Name:      "configure",
    ShortHelp: "[ALPHA] Configure the host to enable more Tailscale features",
    LongHelp: strings.TrimSpace(`
The 'configure' set of commands are intended to provide a way to enable different
services on the host to use Tailscale in more ways.
`),
    FlagSet: (func() *flag.FlagSet {
        fs := newFlagSet("configure")
        return fs
    })(),
    Subcommands: configureSubcommands(),
    Exec: func(ctx context.Context, args []string) error {
        return flag.ErrHelp
    },
}
Copier après la connexion

Le code utilise une fonction littérale(fonction anonyme) puis l'appelle immédiatement.

C'est ce qu'on appelle une expression de fonction immédiatement invoquée (IIFE). Ceci est plus courant dans des langages comme JavaScript, mais peut également être utile dans Go.

Dans Go, les IIFE vous permettent d'isoler des éléments de logique qui produisent des valeurs, créant ainsi un environnement de portée pour les variables qui ne pollue pas l'espace de noms environnant.
Les variables utilisées dans les fonctions anonymes (dans ce cas fs) ne sont pas échappées dans le code environnant. Cela rend le code plus facile à raisonner car les variables n'existent qu'en cas de besoin.

Bien que FlagSet: newFlagSet("configure") 是 true,但 相当于 FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure"); return fs})(), certains avantages de la deuxième forme peuvent être :

  • Extensibilité : si la structure de newFlagSet("configure") 的修改需要更复杂的操作或计算,这些更改可以轻松地合并到匿名函数中,而无需更改 configureCmd est modifiée dans le futur.
  • Débogage : la logique encapsulée peut être facilement annotée, documentée ou modifiée lors d'une session de débogage sans perturber le code environnant.

En regardant le tailscale code, cette utilisation particulière de l'IIFE semble être limitée à cette seule instance.

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!

Étiquettes associées:
source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal