為結構體欄位賦值時。
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中文網其他相關文章!