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變數
- C++臨時變數的生命週期C++變數
- go語言變數Go變數
- React生命週期的變化React
- GO語言————4.4 變數Go變數
- react 生命週期變遷React
- static變數在php和java中的生命週期變數PHPJava
- C++ 煉氣期之變數的生命週期和作用域C++變數
- 初學Go語言 變數Go變數
- Go 語言變數作用域Go變數
- ES6 變數作用域與提升:變數的生命週期詳解變數
- JavaScript變數的生命週期:為什麼let不被提升JavaScript變數
- go語言 變數的宣告與使用Go變數
- Go 語言入門教程:變數Go變數
- 翻譯|Rust臨時變數的生命週期和“Super Let”Rust變數
- View生命週期與Activity生命週期的關係View
- go語言變數的宣告與賦值Go變數賦值
- 細說 rust 生命週期引數Rust
- Flutter 的生命週期Flutter
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- vue的生命週期Vue
- Fragment的生命週期Fragment
- App的生命週期APP
- View的生命週期View
- Servlet的生命週期Servlet
- 討論篇:靜態變數生命週期到底何如?如何使用?變數
- go語言變數宣告後的預設值Go變數
- Delphi字串的引用計數與生命週期字串
- Go 語言編譯期斷言Go編譯
- GO語言變數作用域-坑記錄Go變數
- 第四節 go 語言變數定義Go變數
- GO語言————6.3 傳遞變長引數Go
- GO語言linux下環境變數GoLinux變數
- PHP 生命週期PHP
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session