Rumah >pembangunan bahagian belakang >Golang >Apakah julat persekitaran yang terkandung dalam penutupan?
php Julat persekitaran yang terkandung dalam persekitaran tertutup merujuk kepada unsur, faktor dan keadaan yang terkandung dalam persekitaran tertutup. Persekitaran tertutup merujuk kepada ruang atau julat yang agak tertutup dan terhad, yang boleh menjadi ruang fizikal, seperti makmal atau lantai kilang, atau ruang maya, seperti rangkaian komputer. Dalam persekitaran tertutup, pelbagai faktor seperti suhu, kelembapan, komposisi gas, dll. boleh dikawal dan diselaraskan untuk mencapai tujuan tertentu. Persekitaran tertutup adalah perkara biasa dalam eksperimen penyelidikan saintifik, pengeluaran dan pembuatan dan bidang lain, dan memainkan peranan penting dalam memastikan ketepatan eksperimen dan kualiti produk.
Saya meniru tutorial dalam talian tentang penutupan dan menulis kod berikut.
func foo1() func() { xvalue := 1 x := &xvalue defer func() { xvalue = 2 }() return func() { *x = *x + 1 fmt.printf("foo1 val = %d\n", *x) } } func main() { f1 := foo1() f1() f1() f1() }
Saya keliru, semasa melaksanakan f1 := foo1()
后,变量 xvalue
似乎应该被回收,因此使用 *x
ia sepatutnya salah, tetapi kod di atas tidak mempunyai ralat dan dilaksanakan dengan baik, memberikan output
foo1 val = 3 foo1 val = 4 foo1 val = 5
Jadi saya ingin tahu sama ada penutupan itu menjimatkan nilai penunjuk sebagai tambahan kepada penunjuk itu sendiri, atau adakah mekanisme pengumpulan sampah bahasa go menyebabkan nilai x tidak dipadamkan?
Dalam Go, penutupan mendapat rujukan kepada (alamat) mana-mana pembolehubah yang ditutupnya. Petikan Rujukan Bahasa:
Tersurat fungsi ialah penutupan: ia boleh merujuk pembolehubah yang ditakrifkan dalam fungsi sekeliling. Pembolehubah ini kemudiannya dikongsi antara fungsi sekeliling dan literal fungsi, dan ia berterusan selagi ia boleh diakses.
Jadi, dalam contoh anda:
f1 := foo1()
xValue
wujud (pengkompil boleh memperuntukkannya pada timbunan). Ia akan bermula dengan nilai sifar 0 untuk jenisnya. x
存在并为其分配 xValue
wujud dan berikannya alamat defer
-red 闭包运行并将值 2 分配给 xValue
tunda
-red berjalan dan memberikan nilai 2 kepada x
Mengembalikan pembolehubah penutup penutup
x
,编译器保证即使在 foo
返回后该变量也存在。由于 x
包含 xValue
Titik terakhir boleh menjadi agak rumit: memandangkan penutupan yang dikembalikan merujuk kepada pembolehubah xValue
, pengkompil menjamin bahawa pembolehubah itu wujud walaupun selepas foo
kembali. Memandangkan
xValue
🎜 🎜Untuk meringkaskan, mungkin anda tersandung pengetahuan C++, sebaik sahaja kawalan dikembalikan daripada fungsi, sebarang pembolehubah yang diisytiharkan dalam fungsi tidak lagi wujud, jadi sebarang rujukan kepada pembolehubah yang wujud di luar fungsi menjadi tidak sah . Dalam Go, ini tidak berlaku: bahasa ditakrifkan secara eksplisit sebagai selamat dalam hal ini: pengkompil memastikan bahawa mana-mana pembolehubah mempunyai peruntukan yang betul supaya apabila rujukan kepadanya dikembalikan (atau sebaliknya disampaikan) apabila ia dicipta fungsi panggilan. Dari fungsi ini panggilan dibuat ke dunia luar. 🎜
Atas ialah kandungan terperinci Apakah julat persekitaran yang terkandung dalam penutupan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!