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

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

Linda Hamilton
Lepaskan: 2024-11-10 19:35:02
asal
514 orang telah melayarinya

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
}
Salin selepas log masuk

Keluaran kod ialah:

0
1
2
3
4
4
3
2
1
0
4
4
4
4
4
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan