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!
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!