Mengapakah Saya Tidak Boleh Menentukan Fungsi Bersarang dalam Go, tetapi Saya Boleh Menentukan Struktur Bersarang?

Barbara Streisand
Lepaskan: 2024-11-03 23:44:30
asal
921 orang telah melayarinya

Why Can't I Define Nested Functions in Go, but I Can Define Nested Structures?

Go: Kelas Bersarang Dalam Fungsi

Dalam Go, adalah mungkin untuk mentakrifkan struktur bersarang dalam fungsi, seperti yang ditunjukkan oleh blok kod:

<code class="go">func f() {
    // Nested struct Cls inside f
    type Cls struct {
        ...
    }
}</code>
Salin selepas log masuk

Walau bagaimanapun, tidak mungkin untuk mengisytiharkan fungsi bersarang dalam fungsi, kecuali untuk fungsi lambda. Ini mungkin kelihatan luar biasa memandangkan sokongan untuk struktur bersarang.

Alternatif dan Penyelesaian

Walaupun tidak mungkin untuk menentukan fungsi bersarang dalam pengertian tradisional, terdapat pendekatan alternatif untuk mencapai kefungsian yang serupa:

1. Literal Fungsi:

Tersurat fungsi membolehkan anda mentakrifkan fungsi tanpa nama dan menyimpannya dalam pembolehubah. Fungsi ini kemudiannya boleh digunakan sebagai hujah kepada fungsi lain, atau dalam fungsi ia ditakrifkan. Contohnya:

<code class="go">func f() {
    foo := func(s string) {
        fmt.Println(s)
    }

    foo("Hello World!")
}</code>
Salin selepas log masuk

Dalam contoh ini, literal fungsi diberikan kepada pembolehubah foo dalam f fungsi. Apabila foo dipanggil dengan hujah rentetan, ia mencetak "Hello World!" ke konsol.

2. Penutupan:

Penutupan membolehkan anda mencipta fungsi yang mempunyai akses kepada pembolehubah yang ditakrifkan dalam skop ia dicipta. Ini membolehkan anda "menyarang" fungsi dengan berkesan dengan mentakrifkannya dalam penutupan. Contohnya:

<code class="go">func f() func(s string) {
    return func(s string) {
        fmt.Println(s)
    }
}

foo := f()
foo("Hello World!")</code>
Salin selepas log masuk

Dalam contoh ini, fungsi f mengembalikan literal fungsi yang mempunyai akses kepada pembolehubah dalam skop fungsi. Ini membolehkan anda memanggil fungsi yang dikembalikan dan memberikannya hujah, walaupun ia ditakrifkan dalam f.

Adalah penting untuk ambil perhatian bahawa walaupun alternatif ini memberikan sedikit fleksibiliti, ia tidak sama dengan fungsi bersarang tradisional.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menentukan Fungsi Bersarang dalam Go, tetapi Saya Boleh Menentukan Struktur Bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!