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

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的地址会不会被回收并引起panic?


临摹微笑
浏览 137回答 2
2回答

守候你守候我

不,首先, x 具有全局范围。所以 GC 不会发生,直到为它分配一个具有新地址的新值。现在,当分配一个新值时,可能会发生两件事:将 y 分配给 x 的 Goroutine 发生了。它被分配给 y。然后不会发生 GC。在第一步发生之前,它将通过新地址获得新值。我不知道你想做什么。但是即使 goroutine 同时运行也没有恐慌。X 总是有一个值。既然您问分配是否是原子的:没有正常的分配是原子的。

米脂

“没有真正分配” - 什么,go中没有这样的事情。您的代码有一个竞争条件go run -race,它写入“x”,从“x”读取并同时增长“x”的切片。"y := x" 通常不是原子的,它取决于值,但对于 slice/interface{}/map/struct 肯定不是原子的。有用于原子原语的 sync.atomic 包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go