Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Penyata Tangguh Golang Menangkap Pembolehubah dalam Gelung?

Bagaimanakah Penyata Tangguh Golang Menangkap Pembolehubah dalam Gelung?

DDD
DDDasal
2024-11-11 22:13:02366semak imbas

How Does Golang's Defer Statement Capture Variables in a Loop?

Tangkapan Penutupan dalam Penyata Penangguhan Golang

Pernyataan penangguhan Golang membolehkan tindakan pembersihan dilaksanakan selepas fungsi kembali. Walau bagaimanapun, tidak seperti kebanyakan bahasa, penutupan yang dibuat oleh penangguhan tidak menangkap keadaan semasa pembolehubah dalam fungsi sekeliling, sebaliknya menilai mereka apabila penyataan penangguhan dilaksanakan.

Memahami Bahagian 2 lwn Bahagian. 3

Dalam kod yang diberikan, perbezaan antara Bahagian 2 dan Bahagian 3 terletak pada cara penutupan menangkap pembolehubah i.

Bahagian 2:

for i := range whatever {
    defer func() { fmt.Println(i) }()
}

Dalam Bahagian 2, penutupan menangkap pembolehubah i secara langsung. Apabila kod dalam penutupan dilaksanakan (selepas gelung selesai), nilai i ditentukan oleh lelaran akhir gelung, iaitu 4. Inilah sebabnya Bahagian 2 mengeluarkan "44444."

Bahagian 3:

for i := range whatever {
    defer func(n int) { fmt.Println(n) }(i)
}

Dalam Bahagian 3, penutupan tidak menangkap i secara langsung, sebaliknya mencipta pembolehubah baru n dan memberikannya nilai i pada masa penyata tangguh dilaksanakan . Oleh kerana pernyataan tangguh dilaksanakan untuk setiap lelaran gelung, setiap penutupan mempunyai nilai yang berbeza untuk n. Ini menghasilkan output "43210."

Key Point:

Konsep utama yang perlu diingat ialah kod dalam penutupan dalam penangguhan tidak dilaksanakan apabila penangguhan kenyataan dilaksanakan. Sebaliknya, ungkapan yang digunakan untuk menentukan hujah penutupan (cth., i dalam kes ini) dinilai apabila pernyataan tangguh dilaksanakan.

Atas ialah kandungan terperinci Bagaimanakah Penyata Tangguh Golang Menangkap Pembolehubah dalam Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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