久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Go語言變量的生命周期是啥

      在Go語言中,變量的生命周期指的是在程序運行期間變量有效存在的時間間隔。全局變量的生命周期和整個程序的運行周期是一致的;局部變量的生命周期則是動態(tài)的,從創(chuàng)建這個變量的聲明語句開始,到這個變量不再被引用為止。

      Go語言變量的生命周期是啥

      本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

      Go語言變量的生命周期

      變量的生命周期指的是在程序運行期間變量有效存在的時間間隔。

      變量的生命周期與變量的作用域有著不可分割的聯(lián)系:

      • 全局變量:它的生命周期和整個程序的運行周期是一致的;

      • 局部變量:它的生命周期則是動態(tài)的,從創(chuàng)建這個變量的聲明語句開始,到這個變量不再被引用為止;

      • 形式參數(shù)和函數(shù)返回值:它們都屬于局部變量,在函數(shù)被調(diào)用的時候創(chuàng)建,函數(shù)調(diào)用結(jié)束后被銷毀。

      for t := 0.0; t < cycles*2*math.Pi; t += res {     x := math.Sin(t)     y := math.Sin(t*freq + phase)     img.SetColorIndex(         size+int(x*size+0.5), size+int(y*size+0.5),         blackIndex, // 最后插入的逗號不會導(dǎo)致編譯錯誤,這是Go編譯器的一個特性     )               // 小括號另起一行縮進(jìn),和大括號的風(fēng)格保存一致 }
      登錄后復(fù)制

      上面代碼中,在每次循環(huán)的開始會創(chuàng)建臨時變量 t,然后在每次循環(huán)迭代中創(chuàng)建臨時變量 x 和 y。臨時變量 x、y 存放在棧中,隨著函數(shù)執(zhí)行結(jié)束(執(zhí)行遇到最后一個}),釋放其內(nèi)存。

      棧和堆的區(qū)別在于:

      • 堆(heap):堆是用于存放進(jìn)程執(zhí)行中被動態(tài)分配的內(nèi)存段。它的大小并不固定,可動態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用 malloc 等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)加入到堆上(堆被擴(kuò)張)。當(dāng)利用 free 等函數(shù)釋放內(nèi)存時,被釋放的內(nèi)存從堆中被剔除(堆被縮減);

      • 棧(stack):棧又稱堆棧, 用來存放程序暫時創(chuàng)建的局部變量,也就是我們函數(shù)的大括號{ }中定義的局部變量。

      在程序的編譯階段,編譯器會根據(jù)實際情況自動選擇在?;蛘叨焉戏峙渚植孔兞康拇鎯臻g,不論使用 var 還是 new 關(guān)鍵字聲明變量都不會影響編譯器的選擇。

      var global *int func f() {     var x int     x = 1     global = &x } func g() {     y := new(int)     *y = 1 }
      登錄后復(fù)制

      上述代碼中,函數(shù) f 里的變量 x 必須在堆上分配,因為它在函數(shù)退出后依然可以通過包一級的 global 變量找到,雖然它是在函數(shù)內(nèi)部定義的。用Go語言的術(shù)語說,這個局部變量 x 從函數(shù) f 中逃逸了。

      相反,當(dāng)函數(shù) g 返回時,變量 *y 不再被使用,也就是說可以馬上被回收的。因此,*y 并沒有從函數(shù) g 中逃逸,編譯器可以選擇在棧上分配 *y 的存儲空間,也可以選擇在堆上分配,然后由Go語言的 GC(垃圾回收機(jī)制)回收這個變量的內(nèi)存空間。

      在實際的開發(fā)中,并不需要刻意的實現(xiàn)變量的逃逸行為,因為逃逸的變量需要額外分配內(nèi)存,同時對性能的優(yōu)化可能會產(chǎn)生細(xì)微的影響。

      雖然Go語言能夠幫助我們完成對內(nèi)存的分配和釋放,但是為了能夠開發(fā)出高性能的應(yīng)用我們?nèi)稳恍枰私庾兞康穆暶髦芷?。例如,如果將局部變量賦值給全局變量,將會阻止 GC 對這個局部變量的回收,導(dǎo)致不必要的內(nèi)存占用,從而影響程序的性能。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號