一、init函式介紹
- 一個.go檔案中可以定義一個init()函式,它用來做一些初始化操作,另外,該函式在包匯入中也起到重要的作用
- init函式有哪些特點:
- init函式不能被主動呼叫,也不能在包外通過包名呼叫
- init函式沒有引數也沒有回傳值
- 另外,init函式在匯入包的時候會自動執行,例如B包的b.go中有一個init函式,A包中的a.go在匯入B包的時候,B包中的init函式會自動執行
- init函式一般用來:
- 對變數進行初始化
- 檢查/修復程式的狀態
- 注冊
- 運行一次計算
二、在本地包執行
init函式執行時機
- 一個包如果擁有init函式,那么在運行main()函式之前,全域宣告之后會自動執行init()函式
演示案例
package main import ( "fmt" ) var golbalValue int64 func init() { golbalValue = 100 f() } func f() { fmt.Println("init...") } func main() { fmt.Println("golbalValue: ", golbalValue) }
三、在匯入包中執行
匯入包的順序
- Go語言匯入包的規則:會先從main包開始檢查其匯入的所有包,每個包中又可能匯入了其他的包,Go編譯器由此構建出一個樹狀的包參考關系,再根據參考順序決定編譯順序,依次編譯這些包的代碼
- init()在包匯入中的執行時機是什么呢?
- 一個包在匯入另一個包時,會自動執行另一個包中的init()函式
- 例如B包定義了一個init()函式,A包在呼叫B包時,B包中的init()函式會自動執行
- 在運行時,被最后匯入的包會最先初始化并呼叫其init()函式, 如下圖示:
- 一個應用場景:例如我們的程式匯入了另一個包,但是不會使用到里面的任何變數和函式,我們僅僅是想執行另外一個包中的init()函式(例如,該init()函式會執行一個資料庫的初始化等等),這個時候我們就可以"慷訓入"這個包,然后不使用其中的內容,但執行其包中的init()函式
演示案例
- 第一步:假設現在我們在GOPATH/src/code.dobgshao.com/studgo/testpack/目錄下有一個main.go檔案,其內部定義了一個Init()函式
- 第二步:現在我們在另一個包中匯入上面的那個包,并且它也有自己的init()函式
- 第三步:現在我們執行上面的main.go,可以看到其執行了另一個包中的init()函式,然后再執行自己的init()函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/229270.html
標籤:區塊鏈






