为了账号安全,请及时绑定邮箱和手机立即绑定

这段代码会在 Go1.5 中 GC 后引起恐慌吗?

这段代码会在 Go1.5 中 GC 后引起恐慌吗?

Go
临摹微笑 2022-01-17 10:59:12
package mainimport "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的地址会不会被回收并引起panic?
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

不,首先, x 具有全局范围。所以 GC 不会发生,直到为它分配一个具有新地址的新值。

现在,当分配一个新值时,可能会发生两件事:

  1. 将 y 分配给 x 的 Goroutine 发生了。它被分配给 y。然后不会发生 GC。

  2. 在第一步发生之前,它将通过新地址获得新值。

我不知道你想做什么。但是即使 goroutine 同时运行也没有恐慌。X 总是有一个值。

既然您问分配是否是原子的:没有正常的分配是原子的。


查看完整回答
反对 回复 2022-01-17
?
米脂

TA贡献1836条经验 获得超3个赞

“没有真正分配” - 什么,go中没有这样的事情。

您的代码有一个竞争条件go run -race,它写入“x”,从“x”读取并同时增长“x”的切片。

"y := x" 通常不是原子的,它取决于值,但对于 slice/interface{}/map/struct 肯定不是原子的。有用于原子原语的 sync.atomic 包。


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信