Kelas Bersarang Di Dalam Fungsi dalam Go
Go membenarkan sarang struct dalam fungsi untuk tujuan pengkapsulan. Walau bagaimanapun, persoalan timbul: Adakah terdapat mekanisme untuk menentukan kelas bersarang dalam fungsi?
Dalam Go, fungsi bersarang tidak dibenarkan, kecuali untuk lambda. Sekatan ini menimbulkan kebimbangan tentang kefungsian kelas dalam fungsi.
Untuk mengembangkan isu ini, contoh kod berikut menggambarkan pengehadan:
<code class="go">func f() { // Nested struct Cls inside f type Cls struct { // ... } // Attempt to bind foo to Cls (fails) func (c *Cls) foo() { // ... } }</code>
Kod ini cuba mencipta Cls kelas bersarang dalam fungsi f, tetapi percubaan untuk mengikat kaedah foo kepada Cls gagal. Nampaknya kelas dilemahkan dalam fungsi.
Untuk menangani had ini, Go menyediakan konsep literal fungsi. Literal fungsi membolehkan anda mengisytiharkan fungsi dan menetapkannya kepada pembolehubah. Menggunakan pendekatan ini, anda boleh mencipta sesuatu yang serupa dengan fungsi bersarang:
<code class="go">func f() { foo := func(s string) { fmt.Println(s) } foo("Hello World!") }</code>
Dalam contoh ini, fungsi literal foo dicipta dan diperuntukkan kepada pembolehubah dalam fungsi f. Memanggil f mengeluarkan "Hello World!" seperti yang dijangkakan.
Walaupun literal fungsi menyediakan penyelesaian untuk fungsi bersarang, adalah penting untuk ambil perhatian bahawa ia bukan fungsi bersarang sebenar dan mempunyai had tertentu berbanding kelas bersarang dalam bahasa lain.
Atas ialah kandungan terperinci Adakah Kefungsian Kelas Bersarang Tersedia Dalam Fungsi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!