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 ?

王林
王林avant
2024-02-06 08:06:031094parcourir

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
    })(),

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
    },
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer