goroutine是创建深拷贝还是浅拷贝?

时间:2016-06-23 06:38:12

标签: go goroutine

var person struct {
    name string
    id   int
    phone int
}

func main () {
    var myTest person
    //construct the variable 
    ...


    go func() {
        fmt.Println(myTest.name)
    }()
}

goroutine是否深层复制变量" myTest"从主要功能?

如果我的goroutine是这样的:

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

这个goroutine睡了10秒,所以当主函数改变了" myTest"在10秒内,goroutine会做什么?

2 个答案:

答案 0 :(得分:5)

没有"深拷贝的概念"在go,一切都是通过价值传递的 没有你的样本甚至不是浅拷贝你传递了一个指针(字符串的地址):
如果您在clearNotifications:false功能中更改了myTest.name,那么在更改后再次打印它会看到它会发生变化,请参阅此示例代码示例:

main

首先像这样定义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() }

person struct

第二次使用type person struct { name string id int phone int } 等待goroutine完成。

关于你的主要问题,你可以自己测试一下:

sync.WaitGroup

因此,您在此示例中看到主函数中的字符串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() } 内容更改反映到goroutine,因此它不是副本。
如果你需要像这样的复制电话:

name

并查看:Is it correct to ref a var inside golang func?

答案 1 :(得分:0)

没有"深拷贝的概念"在go中,一切都按价值传递。

在您的实例中,这不是副本,您直接引用变量,如果您想要副本执行以下操作:

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