Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Menangguhkan Penangkapan Penutupan dalam Go Membawa kepada Gelagat Tidak Dijangka?

Mengapa Menangguhkan Penangkapan Penutupan dalam Go Membawa kepada Gelagat Tidak Dijangka?

Linda Hamilton
Linda Hamiltonasal
2024-11-10 19:35:02482semak imbas

Why Does Deferring Closure Capture in Go Lead to Unexpected Behavior?

Menangguhkan Penangkapan Penutupan dalam Go

Pernyataan penangguhan Go boleh digunakan untuk melaksanakan fungsi selepas fungsi sekeliling kembali. Walau bagaimanapun, apabila digunakan dengan penutupan, adalah penting untuk memahami cara penangkapan parameter berfungsi.

Isunya

Pertimbangkan kod berikut:

package main

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

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

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

Keluaran kod ialah:

0
1
2
3
4
4
3
2
1
0
4
4
4
4
4

Analisis

  • Bahagian 1: Mencetak pembilang gelung i seperti yang dijangkakan.
  • Bahagian 2: Menangkap pembolehubah i dalam penutupan. Walau bagaimanapun, apabila penutupan dilaksanakan, i mempunyai nilai daripada lelaran terakhir gelung, iaitu 4. Oleh itu, ia mencetak "44444".
  • Bahagian 3: Tidak menangkap sebarang pembolehubah luar. Penutupan dinilai apabila pernyataan penangguhan dilaksanakan, jadi setiap panggilan penangguhan mempunyai nilai n yang berbeza, menghasilkan "43210".

Perbezaan Utama

Perbezaan penting antara bahagian 2 dan 3 terletak pada sama ada penutupan menangkap pembolehubah luar atau tidak. Dalam bahagian 2, penutupan menangkap i, yang merupakan rujukan kepada pembolehubah luar. Dalam bahagian 3, penutupan tidak mempunyai sebarang rujukan luar, jadi setiap panggilan mempunyai nilai n yang berbeza.

Pertimbangan Tambahan

  • Tunda panggilan adalah dilaksanakan dalam susunan masuk-dahulu (LIFO) sebelum fungsi sekeliling kembali.
  • Ungkapan dinilai apabila pernyataan tangguh dilaksanakan, bukan fungsi itu sendiri.

Atas ialah kandungan terperinci Mengapa Menangguhkan Penangkapan Penutupan dalam Go Membawa kepada Gelagat Tidak Dijangka?. 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