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

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

WBOY
WBOYnach vorne
2024-02-06 09:30:111009Durchsuche

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

Ausgabe:

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen