Rumah >pembangunan bahagian belakang >Golang >Mengapakah fungsi sebaris dipanggil serta-merta dan bukannya hanya fungsi yang mengandunginya?
Apabila memberikan nilai kepada medan struktur.
FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure") return fs })(),
Saya rasa ia sama dengan memanggil newFlagSet("configure"). Apa faedah menulis begini.
Masalah semasa membaca kod sumber. Perlu tahu kenapa dia menulis ini.
Carian pantas, kod ini datang daripada 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 }, }
Kod menggunakan fungsi literal(fungsi tanpa nama) dan kemudian memanggilnya dengan segera.
Ini dipanggil ungkapan fungsi yang dipanggil segera (IIFE). Ini lebih biasa dalam bahasa seperti JavaScript, tetapi boleh berguna dalam Go juga.
Dalam Go, IIFE membolehkan anda mengasingkan kepingan logik yang menghasilkan nilai, mewujudkan persekitaran skop untuk pembolehubah yang tidak mencemarkan ruang nama sekeliling.
Pembolehubah yang digunakan dalam fungsi tanpa nama (dalam kes ini fs
) tidak terlepas ke dalam kod sekeliling. Ini menjadikan kod lebih mudah untuk difikirkan kerana pembolehubah hanya wujud apabila diperlukan.
Walaupun FlagSet: newFlagSet("configure") 是 true,但
相当于 FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure"); return fs})()
, beberapa kelebihan bentuk kedua mungkin:
newFlagSet("configure")
的修改需要更复杂的操作或计算,这些更改可以轻松地合并到匿名函数中,而无需更改 configureCmd
diubah pada masa hadapan. Melihat pada kod skala ekor, penggunaan IIFE tertentu nampaknya terhad kepada satu contoh itu.
Atas ialah kandungan terperinci Mengapakah fungsi sebaris dipanggil serta-merta dan bukannya hanya fungsi yang mengandunginya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!