首頁  >  文章  >  後端開發  >  為什麼立即調用內聯函數,而不是僅僅調用其包含的函數?

為什麼立即調用內聯函數,而不是僅僅調用其包含的函數?

王林
王林轉載
2024-02-06 08:06:031064瀏覽

為什麼立即調用內聯函數,而不是僅僅調用其包含的函數?

問題內容

為結構體欄位賦值時。

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

我覺得就相當於呼叫newFlagSet("configure")。這樣寫有什麼好處。

閱讀原始碼時的問題。需要知道他為什麼這樣寫。


正確答案


快速搜尋,此程式碼來自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
    },
}

程式碼使用函數文字(匿名函數),然後立即呼叫。

這稱為立即呼叫函數表達式 (IIFE)。這在 JavaScript 等語言中更常見,但在 Go 中也很有用。

在 Go 中,IIFE 可讓您隔離產生值的邏輯片段,為變數建立一個不會污染周圍命名空間的作用域環境。
匿名函數中使用的變數(在本例中為 fs)不會轉義到周圍的程式碼中。這使得程式碼更容易推理,因為變數僅在需要時才存在。

雖然FlagSet: newFlagSet("configure") 是true,但 相當於FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure"); return fs })(), some第二種形式的優點可能是:

  • 可擴充性:如果將來newFlagSet("configure") 的修改需要更複雜的操作或計算,這些變更可以輕鬆地合併到匿名函數中,而無需更改configureCmd 的結構。
  • 偵錯:在偵錯會話期間可以輕鬆註解、記錄或修改封裝的邏輯,而不會幹擾周圍的程式碼。

看看 tailscale 程式碼,那個特定的 IIFE使用似乎僅限於該一個實例。

以上是為什麼立即調用內聯函數,而不是僅僅調用其包含的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除