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
WBOYke hadapan
2024-02-06 09:30:111012semak imbas

对于同一结构体,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()
    }
}

Keluaran:

pointer: C
Hello, C
pointer: C
Hello, B
pointer: C
Hello, A

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!

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