2016-06-23 13 views
0

Kopiert die Goroutine die Variable "myTest" aus der Hauptfunktion tief?Erstellt Gorutine eine tiefe Kopie oder flache Kopie?

Wenn mein goroutine wie folgt aus:

go func() { 
    time.Sleep(10 * time.Second) 
    fmt.Println(myTest.name) 
} 

Dieser goroutine sleep 10 Sekunden, so dass, wenn die Hauptfunktion den Wert von "myTest" während 10 Sekunden ändern, was tun goroutine?

Antwort

3

Es gibt kein Konzept der „tiefe Kopie“ in go, alles ist nach Wert übergeben.
nicht Ihre Probe ist noch nicht eine flache Kopie Sie einen Zeiger übergeben (Adresse string):
wenn Sie myTest.name in main Funktion ändern dann wieder Sie drucken es nach dieser Änderung werden Sie sehen, es wird sich ändern, diese beweis sehen Beispielcode:

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : Alex 0xc042006740 
    wg.Add(1) 
    go func() { 
     fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : Alex 0xc042006740 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : J 0xc042006740 
     wg.Done() 
    }() 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

erste person struct wie folgt definieren:

type person struct { 
    name string 
    id int 
    phone int 
} 

zweite Verwendung sync.WaitGroup zu warten goroutine zu beenden .

und über Ihre Hauptfrage, können Sie es sich wie folgt testen:

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    wg.Add(1) 
    go func() { 
     fmt.Printf("%T : %[1]v\n", myTest.name) // string : Alex 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v\n", myTest.name) // string : J 
     wg.Done() 
    }() 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

so wie Sie in diesem Beispiel sehen die Zeichenfolge name Inhaltsänderung in der Hauptfunktion zu goroutine reflektiert wird, so ist es nicht ein Kopieren.
wenn Sie kopieren müssen wie folgt aufrufen:

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    wg.Add(1) 
    go func(name string) { 
     fmt.Printf("%T : %[1]v\n", name) // string : Alex 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v\n", name) // string : Alex 
     wg.Done() 
    }(myTest.name) 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

und sehen: Is it correct to ref a var inside golang func?

0

Es gibt kein Konzept von "Deep Copy" in Go, alles wird nach Wert übergeben.

In Ihrem Beispiel, das ist keine Kopie, Sie Verweis auf die Variable direkt, wenn Sie eine Kopie etwas tun, wie wollen:

myTest := myTest 
time.Sleep(10 * time.Second) 
fmt.Println(myTest.name)