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会做什么?
答案 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
答案 1 :(得分:0)
没有"深拷贝的概念"在go中,一切都按价值传递。
在您的实例中,这不是副本,您直接引用变量,如果您想要副本执行以下操作:
myTest := myTest
time.Sleep(10 * time.Second)
fmt.Println(myTest.name)