2016-03-22 6 views
1

Testcode siehe:golang Verschluss (anonyme Funktion) fängt falsch parameter`s Wert

package main 

import "fmt" 

func main() { 
    i := 10 

    closure1 := func() { 
     fmt.Printf("closure, i: %d\n", i) 
     i = 15 
    } 

    closure1() 

    fmt.Printf("in main, i: %d\n", i) 

    closure2 := func(x int) { 
     fmt.Printf("function call, pass parameter, i: %d\n", x) 
    } 

    i = 20 

    closure1() 
    closure2(i) 
} 

denke ich, die Ausgabe des closure2 20 sein sollte, aber das eigentliche Ergebnis ist 15, ich weiß nicht, warum? ??? Jeder kann mir helfen, bitte sehen Sie meinen Kommentar in meinem Code, danke im Voraus.

+1

'i' ist 15 am Ende von' closure1' zugewiesen, das Sie vor Ihrem Aufruf von 'closure2' aufrufen. So übergeben Sie 15 zu 'closure2' –

+0

[Fallstricke mit Closures in Go] (http://www.goinggo.net/2014/06/pitfalls-with-closures-in-go.html) –

+0

ich sehe, Golang Verschluss fangen ein Verweis auf i, kein Snapshot-Wert, ich bekomme es, vielen Dank noch einmal. – scott

Antwort

1

Das Problem ist, dass Ihre erste Zuweisung i bis 15, wenn Ihre closure1() Aufruf Und dann Schließung zwei Sie es drucken .. Ihre closure1()nach tun i bis 20 zuweisen .. Das ist das Problem, das Ihr Problem beheben soll:

package main 

import "fmt" 

func main() { 
    i := 10 

    closure1 := func() { 
     fmt.Printf("closure, i: %d\n", i) 
     i = 15 
    } 

    closure1() 

    fmt.Printf("in main, i: %d\n", i) 

    closure2 := func(x int) { 
     fmt.Printf("function call, pass parameter, i: %d\n", x) 
    } 



    closure1() 
    i = 20 // Now it assigns it back to 20.. So the result below will become 20... 
    closure2(i) 
} 

Sie sehen Ihr Problem?

+0

ja, im Wesentlichen \t Golang Verschluss fangen einen Verweis auf ich, kein Snapshot-Wert, ich bekomme es, ich danke Ihnen John und dsafds wieder, "\t Fallstricke mit Closures In Go" ist gutes Lernmaterial. – scott

0

Die letzte Zeile von closure1 setzt i auf 15. Dies gehört zum main() Kontext.

Die vorletzte Zeile des Hauptaufrufs closure1() erneut. Also wird das i von main wieder auf 15 gesetzt.