Go語言變數的生命週期
1 變數的生命週期
生命週期是指程式執行過程中變數存在的時間段。下面我們分別來看看包變數(全域性變數)和區域性變數兩種變數的生命週期。
① 包變數一直常駐在記憶體到程式的結束,然後被系統垃圾回收器回收。也就是說包變數的生命週期是整個程式的執行時間。
② 區域性變數,例如一個函式中定義的變數。它有一個動態的生命週期:每次執行生命語句時建立一個新的實體,變數一直生存到它變得不可訪問(例如沒有外部指標指向它,函式退出我們沒有路徑能訪問到這個變數),這時它佔用的儲存空間就會被回收。
所以我們有結論:
並不是定義在函式內部的區域性變數在訪問退出函式後就會被回收!
2 堆與棧的分配
學過其他諸如C/C++語言的都知道,變數定義完成一般是分配在堆和棧空間上的。存在哪個空間上是跟你是否動態分配記憶體有關(new/malloc)。但是在Go語言上這個選擇並不是基於使用var和new關鍵字來宣告變數的。
我們看下面兩個程式例項:
var p *int //全域性指標變數
func f(){
var i int
i = 1
p = &x //全域性指標變數指向區域性變數i
}
func f(){
p := new(int) //區域性指標變數,使用new申請的空間
*p = 1
}
上面程式中,第一個程式雖然i是通過var申請的區域性變數,但是由於有外部指標指向訪問,我們有路徑可找到這個空間(變數能夠逃逸出函式),所以區域性變數i是申請在堆空間上。而第二個程式中p指標變數雖然是使用new申請的空間,但是由於退出函式就沒有路徑可尋找到它(變數無法逃出函式),所以區域性變數p是申請在棧空間上的。
另外我需要提的一點,Go語言區別於C/C++,雖然變數申請在堆空間上,但是它有自動回收垃圾的功能,所以這些堆地址空間也無需我們手動回收,系統會在需要釋放的時刻自動進行垃圾回收。
相關文章
- Go語言變數生命期和變數逃逸分析Go變數
- Javascript 變數生命週期JavaScript變數
- go語言變數Go變數
- GO語言————4.4 變數Go變數
- React生命週期的變化React
- react 生命週期變遷React
- 初學Go語言 變數Go變數
- go語言 變數的宣告與使用Go變數
- C++ 煉氣期之變數的生命週期和作用域C++變數
- JavaScript變數的生命週期:為什麼let不被提升JavaScript變數
- Go 語言入門教程:變數Go變數
- go語言變數的宣告與賦值Go變數賦值
- 翻譯|Rust臨時變數的生命週期和“Super Let”Rust變數
- View生命週期與Activity生命週期的關係View
- 生命週期
- 第四節 go 語言變數定義Go變數
- GO語言————6.3 傳遞變長引數Go
- GO語言變數作用域-坑記錄Go變數
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- 討論篇:靜態變數生命週期到底何如?如何使用?變數
- 細說 rust 生命週期引數Rust
- GO語言基礎(結構+語法+型別+變數)Go型別變數
- [JAVA] Java物件導向之final、abstract抽象、和變數生命週期Java物件抽象變數
- 品牌生命週期和產品生命週期之間的關係
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session