Bei gleicher Struktur verhält sich Golang beim Aufschieben in der for-Schleife anders

WBOY
Freigeben: 2024-02-06 09:30:11
nach vorne
938 Leute haben es durchsucht

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

Frageninhalt

Ich habe den folgenden Golang-Code geschrieben und ausgeführt.

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()
    }
}
Nach dem Login kopieren

Ausgabe:

pointer: C
Hello, C
pointer: C
Hello, B
pointer: C
Hello, A
Nach dem Login kopieren

Mein Verständnis ist, wie wirken sich Hinweise t 在 3 个循环后将指向“c”,因此三个 3“c”用于“hello2”输出。然而,延迟“hello”函数调用的行为非常奇怪。看起来它正在保留它所指向的位置。 (t test) darauf aus?

Ich bin gespannt, was Golang daraus kompiliert. Vielen Dank!


Die richtige Antwort


befindet sich in einer for-Schleife, defer 语句的参数是一个闭包。闭包捕获循环变量 t.

Bei Aufrufen mit einem Wertempfänger enthält der Abschluss den t 的副本。对于使用指针接收器的调用,闭包包含一个指向 t-Zeiger.

Schleifenvariablen werden bei jeder Iteration neu geschrieben (dieses Verhalten wird sich in späteren Versionen der Sprache ändern). Daher erfassen Wertempfängerabschlüsse jeden Wert, während Zeigerempfängerabschlüsse nur den Zeiger erfassen, sodass sie zur Laufzeit den neuesten Wert dieses Zeigers verwenden.

Das obige ist der detaillierte Inhalt vonBei gleicher Struktur verhält sich Golang beim Aufschieben in der for-Schleife anders. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!