Go語言中init函數和defer延遲調用關鍵詞詳解
Go語言中init函數和defer延遲調用關鍵詞
golang里面有兩個保留函數
main 函數(只能應用于package main)
init 函數(能夠應用于所有的package)
go程序會自動調用 init()和main() 所以你不能在任何地方調用這兩個函數
package main 必須包含一個main 函數,但是每個package中的init函數都是可選的
一個package 里可以寫多個init函數,建議每個包中只寫一個init函數
單個包中代碼執(zhí)行順序如下
main包 --> 常量 -->全局變量 --> init函數 --> main函數 -->exit
多個包之間的代碼執(zhí)行順序
先按層級import 包,從最后引入包中加載常量、變量、init(),返回上級包 繼續(xù)執(zhí)行 加載常量、變量、init()
defer關鍵字,延遲調用
go語言中沒有其他面向對象的析構函數,但是go語言提供了defer語句用于實現其他面向對象語言的析構函數
defer常用于釋放資源、接觸鎖定以及錯誤處理等
無論在函數內什么地方注冊defer 語句,他都會在所屬函數執(zhí)行完畢后才會執(zhí)行,并且如果注冊了多個的defer語句,他們會按照后進先出(先進后出)得原則執(zhí)行,所以一些資源我們開后就可以注冊defer語句關閉。
package main
import "fmt"
func main(){
defer fmt.Println("我是第一個被注冊,最后被打印,因為defer先進后出")
fmt.Print("我先被打印")
defer fmt.Println("我第二個被注冊,但是先被打印")
}補充:go語言中defer關鍵字(延遲調用)用法你會嗎
一.defer關鍵字介紹:
Go語言中的defer語句會將其后面跟隨的語句進行延遲處理,在defer歸屬的函數(如main函數)即將返回時(即函數快結束),將延遲處理的語句按defer定義的逆序進行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
看代碼如下呢:
package main
import "fmt"
// Go語言中的defer語句會將其后面跟隨的語句進行延遲處理
// 在defer歸屬的函數(如main函數)即將返回時(即函數快結束),將延遲處理的語句按defer定義的逆序進行執(zhí)行
// 也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
func main() {
fmt.Println("start...")
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
fmt.Println("stop...")
}而這是運行結果:
start...
stop...
3
2
1
可以看出,start...和stop...先被輸出,然后是3 2 1,即Go語言中的defer語句會將其后面跟隨的語句進行延遲處理,在defer歸屬的函數(如main函數)即將返回時(即函數快結束),將延遲處理的語句按defer定義的逆序進行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
到此這篇關于Go語言中init函數和defer延遲調用關鍵詞的文章就介紹到這了,更多相關go init函數和defer延遲調用關鍵詞內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

