Reka Letak Memori Penutupan dalam Go
Fungsi Go, termasuk penutupan, melaksanakan skop leksikal, membenarkannya merujuk pembolehubah yang diisytiharkan dalam skop lampirannya . Tingkah laku ini menimbulkan persoalan tentang bagaimana penutupan ini diwakili dalam ingatan.
Dalam Go, penutupan pada asasnya ialah pembolehubah yang merujuk kepada persekitaran di mana ia dicipta. Memori yang diperuntukkan untuk penutupan terdiri daripada:
Saiz memori yang diperuntukkan untuk penutupan bergantung pada platform dan seni bina, tetapi ia biasanya melibatkan:
Sebagai contoh, pertimbangkan penutupan berikut:
type M int func (m *M) Adder(amount int) func() { return func() { *m = *m + amount } }
Apabila kod memanggil := m.Adder(), dua penutupan dibuat :
The susun atur memori penutupan pertama akan terdiri daripada:
Jumlah memori yang diperuntukkan ialah 16 bait.
Susun atur memori penutupan kedua akan terdiri daripada:
Jumlah memori yang diperuntukkan ialah 24 bait.
Ringkasnya, penutupan Go dilaksanakan pada timbunan dan menyimpan penuding kepada kod fungsi serta rujukan kepada pembolehubah yang ditangkap. Saiz memori yang diperuntukkan bergantung pada bilangan pembolehubah yang ditangkap dan seni bina platform.
Atas ialah kandungan terperinci Bagaimanakah Penutupan Go Diwakili dalam Ingatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!