Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wird die Inline-Funktion sofort aufgerufen und nicht nur die enthaltende Funktion?

Warum wird die Inline-Funktion sofort aufgerufen und nicht nur die enthaltende Funktion?

王林
王林nach vorne
2024-02-06 08:06:031019Durchsuche

Warum wird die Inline-Funktion sofort aufgerufen und nicht nur die enthaltende Funktion?

Frageninhalt

Beim Zuweisen von Werten zu Strukturfeldern.

FlagSet: (func() *flag.FlagSet {
        fs := newFlagSet("configure")
        return fs
    })(),

Ich denke, es ist gleichbedeutend mit dem Aufruf von newFlagSet("configure"). Welche Vorteile hat es, auf diese Weise zu schreiben?

Probleme beim Lesen des Quellcodes. Ich muss wissen, warum er das geschrieben hat.


Richtige Antwort


Schnellsuche, dieser Code kommt von 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
    },
}

Der Code verwendet ein Funktionsliteral (anonyme Funktion) und ruft es dann sofort auf.

Dies wird als sofort aufgerufener Funktionsausdruck (IIFE) bezeichnet. Dies kommt häufiger in Sprachen wie JavaScript vor, kann aber auch in Go nützlich sein.

In Go können Sie mit IIFEs Teile der Logik isolieren, die Werte erzeugen, und so eine Scoping-Umgebung für Variablen erstellen, die den umgebenden Namespace nicht verschmutzt.
In anonymen Funktionen verwendete Variablen (in diesem Fall fs) werden nicht in den umgebenden Code maskiert. Dies erleichtert das Nachdenken über den Code, da Variablen nur dann vorhanden sind, wenn sie benötigt werden.

Obwohl FlagSet: newFlagSet("configure") 是 true,但 相当于 FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure"); return fs})(), können einige Vorteile der zweiten Form sein:

  • Erweiterbarkeit: Wenn die Struktur von newFlagSet("configure") 的修改需要更复杂的操作或计算,这些更改可以轻松地合并到匿名函数中,而无需更改 configureCmd in Zukunft geändert wird.
  • Debugging: Gekapselte Logik kann während einer Debugging-Sitzung einfach mit Anmerkungen versehen, dokumentiert oder geändert werden, ohne den umgebenden Code zu stören.

Wenn man sich den Tailscale-Code ansieht, scheint diese bestimmte IIFE-Nutzung auf diese eine Instanz beschränkt zu sein.

Das obige ist der detaillierte Inhalt vonWarum wird die Inline-Funktion sofort aufgerufen und nicht nur die enthaltende Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen