Go init 函式

wacho發表於2020-02-24

go語言中init函式用於包(package)的初始化,該函式是go語言的一個重要特性,有下面的特徵:

1 init函式是用於程式執行前做包的初始化的函式,比如初始化包裡的變數等
2 每個包可以擁有多個init函式
3 包的每個原始檔也可以擁有多個init函式
4 同一個包中多個init函式的執行順序go語言沒有明確的定義
5 不同包的init函式按照包匯入的依賴關係決定該初始化函式的執行順序
6 init函式不能被其他函式呼叫,而是在main函式執行之前,自動被呼叫

包的初始化

為了使用匯入的包,首先必須將其初始化。初始化總是以單執行緒執行,並且按照包的依賴關係順序執行。這透過Golang的執行時系統控制,如下圖所示:

  1. 初始化匯入的包(遞迴匯入)
  2. 對包塊中宣告的變數進行計算和分配初始值
  3. 執行包中的init函式
    Go init 函式

下面二個檔案進行演示:
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")
}

執行 go build ap.go main.go,編譯之後執行./main:

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

可以得出的是:

1 一個package或者是go檔案可以包含多個init函式,

 2 init函式是在main函式之前執行的,

 3 init函式被自動呼叫,不能在其他函式中呼叫,顯式呼叫會報該函式未定義

執行順序:解析變數 > init 函式 > main 函式

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章