Rumah > pembangunan bahagian belakang > Golang > Untuk struktur yang sama, Golang berkelakuan berbeza dalam menangguhkan untuk gelung

Untuk struktur yang sama, Golang berkelakuan berbeza dalam menangguhkan untuk gelung

WBOY
Lepaskan: 2024-02-06 09:30:11
ke hadapan
1012 orang telah melayarinya

对于同一结构体,Golang 在 for 循环中 defer 的行为有所不同

Kandungan soalan

Saya menulis kod golang berikut dan menjalankannya.

type test struct {
    name string
}

func (t test) hello() {
    fmt.printf("hello, %s\n", t.name)
}

func (t *test) hello2() {
    fmt.printf("pointer: %s\n", t.name)
}

func runt(t test) {
    t.hello()
}

func main() {
    mapt := []test{
        {name: "a"},
        {name: "b"},
        {name: "c"},
    }

    for _, t := range mapt {
        defer t.hello()
        defer t.hello2()
    }
}
Salin selepas log masuk

Keluaran:

pointer: C
Hello, C
pointer: C
Hello, B
pointer: C
Hello, A
Salin selepas log masuk

Pemahaman saya, bagaimanakah petunjuk t 在 3 个循环后将指向“c”,因此三个 3“c”用于“hello2”输出。然而,延迟“hello”函数调用的行为非常奇怪。看起来它正在保留它所指向的位置。 (t test) mempengaruhi perkara ini?

Saya ingin tahu tentang apa golang menyusun ini. Terima kasih banyak-banyak!


Jawapan yang betul


berada di dalam gelung untuk, defer 语句的参数是一个闭包。闭包捕获循环变量 t.

Untuk panggilan menggunakan penerima nilai, penutupan mengandungi penunjuk t 的副本。对于使用指针接收器的调用,闭包包含一个指向 t.

Pembolehubah gelung ditulis semula pada setiap lelaran (tingkah laku ini akan berubah dalam versi bahasa yang lebih baru). Oleh itu, penutupan penerima nilai menangkap setiap nilai, manakala penutupan penerima penunjuk hanya menangkap penunjuk, jadi pada masa jalan mereka menggunakan nilai terkini penuding itu.

Atas ialah kandungan terperinci Untuk struktur yang sama, Golang berkelakuan berbeza dalam menangguhkan untuk gelung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan