Heim >Backend-Entwicklung >Golang >Teilen Sie ein Go-Language-Mining-Pit: Problem mit der Schließung gemeinsamer Variablen

Teilen Sie ein Go-Language-Mining-Pit: Problem mit der Schließung gemeinsamer Variablen

藏色散人
藏色散人nach vorne
2021-04-12 11:27:362573Durchsuche

Die folgende Tutorial-Kolumne von golang zeigt Ihnen eine Go-Sprache-Falle: Das Problem mit der Schließung gemeinsamer Variablen. Ich hoffe, dass es für Freunde hilfreich sein wird, die es brauchen!

Teilen Sie ein Go-Language-Mining-Pit: Problem mit der Schließung gemeinsamer Variablen

Schauen wir uns ohne weiteres den Code und die Kommentare an:

package mainimport (
    "fmt"
    "time")func main() {
    // 错误示例(打印出的结果是5个6)
    fmt.Println("closure buggy example...")
    for i := 1; i <= 5; i++ {
        // 每个goroutine共享一个变量,goroutine还没开始的时候,i已经变成了6
        go func() {
            fmt.Println(i)
        }()
    }
    time.Sleep(1 * time.Second)


    // 正确示例1:
    fmt.Println("normal example...")
    for i := 1; i <= 5; i++ {
        go func(i int) {   // 使用局部变量
            fmt.Println(i)
        }(i)
    }
    time.Sleep(1 * time.Second)

    // 正确示例2:
    fmt.Println("normal example 2...")
    for i := 1; i <= 5; i++ {
        i := i  // 为每个闭包创建一个变量
        go func() {
            fmt.Println(i)
        }()
    }
    time.Sleep(1 * time.Second)}

Die durch die Ausführung erzielten Ergebnisse sind wie folgt:

closure buggy example...66666normal example...52134normal example 2...52134

Die Gründe und Lösungen finden Sie in den Codekommentaren. Das erste Beispiel ist ein falsches Beispiel und das zweite und dritte Beispiel sind richtige Beispiele.

Das obige ist der detaillierte Inhalt vonTeilen Sie ein Go-Language-Mining-Pit: Problem mit der Schließung gemeinsamer Variablen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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