第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如果局部變量在放入通道后失去其作用域,會發(fā)生什么情況?

如果局部變量在放入通道后失去其作用域,會發(fā)生什么情況?

Go
慕勒3428872 2022-09-12 16:07:04
特別是當變量在本地作用域內生成時。它的存活時間有多長?例如,給定一個循環(huán)創(chuàng)建 10 只狗,并將指針傳遞到一個通道中,例如for i := 0; i < 10; i++ {    dogAddr := produce(i)    // assume we already have: func produce(i int) *Dog     c <- dogAddr             // c: channel}當循環(huán)結束時,狗會立即被釋放嗎?它們會只存活一段神奇的時間等待被消耗,它們會在被消耗后被釋放嗎?我在一個簡單的代碼中對此進行了測試,結果似乎表明局部變量將永遠存在。package mainimport (    "fmt"    "time")func main() {    var a int    var c chan *int = make(chan *int, 1000)    var m map[int]*int = make(map[int]*int)    for i := 0; i < 10; i++ {                     // this is generation-loop        x := i        m[i] = &x        fmt.Println(i, "mapping to: ", &a)        c <- &x    }                                            // the generation-loop breaks here    for i := 0; i < 10; i++ {        fmt.Println(i, "stored pointer: ", m[i]) // we can still call the variables     }    for i := 0; i < 10; i++ {        fmt.Println(i, "stored value: ", *m[i])  // we can still call the variables         p := <-c        fmt.Println(i, "channel value: ", *p)    // we can still call the variables     }    time.Sleep(20 * time.Second)}我對為什么會發(fā)生這種情況感到非常困惑。只要局部塊完成,局部變量就不會失去其壽命嗎?如果我使用的方式是錯誤的,那么在Go中將局部變量傳遞給外部用戶的正確方法是什么?
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

圍棋是垃圾收集。當不再有對資源的引用(包括當前保存在緩沖通道中的引用)時,將釋放資源。您不必擔心釋放后使用,并且返回/發(fā)送指向“局部”變量的指針也沒有錯。

只要局部塊完成,局部變量就不會失去其壽命嗎?

不,當垃圾回收器沒有發(fā)現(xiàn)對其價值的進一步引用時,它們會“失去生命”。超出其封閉作用域的變量會自動在堆上分配,并且在流從封閉作用域返回并且其堆棧內存丟失后可以安全使用。

可以這樣想:在 Go 中沒有“局部”變量這樣的東西,它比它的范圍長。這是不可能的。根據定義,超出聲明范圍的變量不是該意義上的“本地”變量,它會自動移動到堆中,并且只要任何內容繼續(xù)引用它,它就會存活。

值得擴展的內容:

for i := 0; i < 10; i++ {
   dogAddr := produce(i)    // assume we already have: func produce(i int) *Dog 
   c <- dogAddr             // c: channel}

當循環(huán)結束時,狗會立即被釋放嗎?

你的困惑似乎要么源于變量本身在某種程度上與它所指向的內存同義的想法,要么源于一個錯誤的想法,即指針超出范圍會以某種方式導致它所指向的記憶被回收,而其他東西仍然指向它,這在任何語言中都不是真的, 垃圾回收與否。dogAddrdogAddr

指針只包含一個地址。該變量循環(huán)的每次迭代中都會超出范圍,但它所保存的值(堆上對象的地址)已被值復制到通道中。是的,是一個“局部”變量,但這并不重要。它的值不是“本地的”,它的值是內部分配下來的某個非本地對象的內存地址。dogAddrDogdogAddrDogprocess()

我在一個簡單的代碼中對此進行了測試,結果似乎表明局部變量將永遠存在。

不,您剛剛表明,只要您引用了一點內存,該內存就不會被垃圾回收。


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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