Heim  >  Artikel  >  Backend-Entwicklung  >  Die Goroutine-Ausgabe ist falsch

Die Goroutine-Ausgabe ist falsch

WBOY
WBOYnach vorne
2024-02-11 14:20:08944Durchsuche

Goroutine 的输出不正确

PHP-Editor Zimo stellt Ihnen heute eine Frage zu Goroutine: Warum ist das Ausgabeergebnis von Goroutine manchmal falsch? Goroutine ist ein leichter Thread in der Go-Sprache, der Aufgaben gleichzeitig ausführen kann, aber manchmal können seine Ausgabeergebnisse falsch sein. Was ist also der Grund für diese Situation? Lass es uns gemeinsam erkunden! Wenn wir dieses Problem verstehen, können wir besser verstehen, wie Goroutine funktioniert, und ähnliche Probleme in der tatsächlichen Entwicklung vermeiden.

Frageninhalt

Ich habe mir eine Vorlesung angesehen, in der der Autor mithilfe von Go-Routinen eine Statusanwendung erstellt hat, die sich nach einer Weile seltsam verhielt.

Der Code lautet wie folgt:

65bcd28b0b95

Die Ausgabe, die ich erhalte, ist:

65bcd28b0ba0

Ich verstehe nicht, warum „amazon.com“ hier ständig wiederholt wird? Warum passiert das, nachdem alle 5 Links gedruckt wurden?

Workaround

Das Problem liegt an der Schleifenvariablen l 的闭包捕获。由于 goroutine 是在循环内启动的,因此循环创建的所有 goroutine 共享 l 的相同内存地址。当睡眠结束并执行 goroutine 时,由于循环迭代剩余的链接,l 的值已更改。因此,所有 goroutine 最终都会检查 links dem letzten Link im Slice, der "http://amazon.com" ist. Um dieses Problem zu lösen, müssen Sie die Schleifenvariable l als Parameter an die anonyme Funktion innerhalb der Goroutine übergeben. Hier ist eine aktualisierte Version des Codes:

for l := range c {
    go func(link string) {
        time.Sleep(5 * time.Second)
        checkLink(link, c)
    }(l)
}

Durch die Übergabe von l 作为参数传递给匿名函数,每个 goroutine 将拥有自己的 l als Argument an die anonyme Funktion verfügt jede Goroutine über eine eigene Kopie von

, wobei der korrekte Wert für jede Iteration beibehalten wird. 🎜

Das obige ist der detaillierte Inhalt vonDie Goroutine-Ausgabe ist falsch. 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