Rumah >pembangunan bahagian belakang >Golang >Mengapakah fungsi sebaris dipanggil serta-merta dan bukannya hanya fungsi yang mengandunginya?

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

王林
王林ke hadapan
2024-02-06 08:06:031096semak imbas

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
    })(),

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
    },
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam