go init 函數(shù)

go語言中init函數(shù)用于包(package)的初始化,該函數(shù)是go語言的一個重要特性,有下面的特征:

1 init函數(shù)是用于程序執(zhí)行前做包的初始化的函數(shù),比如初始化包里的變量等
2 每個包可以擁有多個init函數(shù)
3 包的每個源文件也可以擁有多個init函數(shù)
4 同一個包中多個init函數(shù)的執(zhí)行順序go語言沒有明確的定義
5 不同包的init函數(shù)按照包導(dǎo)入的依賴關(guān)系決定該初始化函數(shù)的執(zhí)行順序
6 init函數(shù)不能被其他函數(shù)調(diào)用,而是在main函數(shù)執(zhí)行之前,自動被調(diào)用

包的初始化

為了使用導(dǎo)入的包,首先必須將其初始化。初始化總是以單線程執(zhí)行,并且按照包的依賴關(guān)系順序執(zhí)行。這通過Golang的運行時系統(tǒng)控制,如下圖所示:

  1. 初始化導(dǎo)入的包(遞歸導(dǎo)入)
  2. 對包塊中聲明的變量進(jìn)行計算和分配初始值
  3. 執(zhí)行包中的init函數(shù)


    image.png

下面二個文件進(jìn)行演示:
main.go

package main

import (
   "fmt"
)

var _ int64 = cc()

func init() {
   fmt.Println("main.init1")
}
func init() {
   fmt.Println("main. init2")
}

func cc() int64 {
   fmt.Println("calling cc() in main.go")
   return 1
}
func main() {

   fmt.Println("main.ing")
}

ap.go

package main

import "fmt"

func init() {
   fmt.Println("ap.init1")
}
func init() {
   fmt.Println("ap.init2")
}

執(zhí)行 go build ap.go main.go,編譯之后執(zhí)行./main:

calling cc() in main.go
main.init1
main. init2
ap.init1
ap.init2
main.ing

可以得出的是:

1 一個package或者是go文件可以包含多個init函數(shù),

 2 init函數(shù)是在main函數(shù)之前執(zhí)行的,

 3 init函數(shù)被自動調(diào)用,不能在其他函數(shù)中調(diào)用,顯式調(diào)用會報該函數(shù)未定義

執(zhí)行順序:解析變量 > init 函數(shù) > main 函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容