亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這段代碼會在 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 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號