package main
import "time"
var x = []string{}
func main() {
go func() {
for {
y := x
y = append(y, "aa")
}
}()
go func() {
for {
x = []string{"123"}
}
}()
for {
time.Sleep(1)
}
}
猜测,当x(例如,123的地址)没有真正分配给y时,x被分配给像124这样的新地址。 就在这次gc发生的时候,123的地址会被回收并引起恐慌吗?
答案 0 :(得分:1)
没有。首先,x具有全局范围。因此,只有分配了具有新地址的新值,GC才会发生。
现在,当分配新值时,可能会发生两件事:
我不知道你要做什么。但即使goroutine同时运行也没有恐慌。 X总是有一个值。
因为你问过赋值是否是原子的:没有正常的赋值是原子的。
答案 1 :(得分:1)
"并未真正分配" - 什么,没有这样的东西。
您的代码具有竞争条件go run -race
,它写入" x",从" x"并且同时增长" x"'切片。
" y:= x"一般来说它不是原子的,它取决于值,但对于slice / interface {} / map / struct来说肯定不是原子的。有原子基元的sync.atomic包。