Mengapakah fungsi sebaris dipanggil serta-merta dan bukannya hanya fungsi yang mengandunginya?

王林
Lepaskan: 2024-02-06 08:06:03
ke hadapan
1056 orang telah melayarinya

Mengapakah fungsi sebaris dipanggil serta-merta dan bukannya hanya fungsi yang mengandunginya?

Kandungan soalan

Apabila memberikan nilai kepada medan struktur.

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

Saya rasa ia sama dengan memanggil newFlagSet("configure"). Apa faedah menulis begini.

Masalah semasa membaca kod sumber. Perlu tahu kenapa dia menulis ini.


Jawapan betul


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
    },
}
Salin selepas log masuk

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:

  • Kebolehlanjutan: Jika struktur newFlagSet("configure") 的修改需要更复杂的操作或计算,这些更改可以轻松地合并到匿名函数中,而无需更改 configureCmd diubah pada masa hadapan.
  • Penyahpepijatan: Logik terkapsul boleh diberi anotasi, didokumenkan atau diubah suai dengan mudah semasa sesi nyahpepijat tanpa mengganggu kod sekeliling.

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan