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 不會發生,直到為它分配一個具有新地址的新值。
現在,當分配一個新值時,可能會發生兩件事:
將 y 分配給 x 的 Goroutine 發生了。它被分配給 y。然后不會發生 GC。
在第一步發生之前,它將通過新地址獲得新值。
我不知道你想做什么。但是即使 goroutine 同時運行也沒有恐慌。X 總是有一個值。
既然您問分配是否是原子的:沒有正常的分配是原子的。

米脂
TA貢獻1836條經驗 獲得超3個贊
“沒有真正分配” - 什么,go中沒有這樣的事情。
您的代碼有一個競爭條件go run -race
,它寫入“x”,從“x”讀取并同時增長“x”的切片。
"y := x" 通常不是原子的,它取決于值,但對于 slice/interface{}/map/struct 肯定不是原子的。有用于原子原語的 sync.atomic 包。
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消