Rumah >pembangunan bahagian belakang >Golang >Apakah julat persekitaran yang terkandung dalam penutupan?

Apakah julat persekitaran yang terkandung dalam penutupan?

WBOY
WBOYke hadapan
2024-02-10 11:12:09994semak imbas

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.

Kandungan soalan

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?

Penyelesaian

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:

  1. f1 := foo1()

    1. Jadikan pembolehubah xValue wujud (pengkompil boleh memperuntukkannya pada timbunan). Ia akan bermula dengan nilai sifar 0 untuk jenisnya.
    2. Jadikan pembolehubah x 存在并为其分配 xValue wujud dan berikannya alamat
    3. .
    4. Penutupan defer-red 闭包运行并将值 2 分配给 xValuetunda-red berjalan dan memberikan nilai 2 kepada
    5. .
    6. xMengembalikan pembolehubah penutup penutup
    7. .

    x,编译器保证即使在 foo 返回后该变量也存在。由于 x 包含 xValueTitik terakhir boleh menjadi agak rumit: memandangkan penutupan yang dikembalikan merujuk kepada pembolehubah xValue, pengkompil menjamin bahawa pembolehubah itu wujud walaupun selepas foo kembali. Memandangkan

    mengandungi alamat
  2. (dan oleh itu merupakan rujukan langsung kepadanya), alamat itu masih wujud dan tidak boleh dikumpul sampah. Menggunakan kaedah analisis melarikan diri yang sama, pengkompil menjamin bahawa
  3. bertahan dengan kembalinya fungsi yang diisytiharkan.

    xValue

  4. Anda laksanakan penutupan yang dikembalikan, yang diubah suai oleh penuding kepadanya
– tiada keajaiban berlaku di sini. Dua panggilan lain melakukan operasi yang sama.

🎜 🎜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!

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