1. 程式人生 > >有關golang package中init方法的多處定義及執行順序問題

有關golang package中init方法的多處定義及執行順序問題

在不瞭解這個問題之前,在網上搜索一下竟然搜出了兩個完全相反的結果,所以打算自己測試下這個問題。

首先給出結論:

  1. 在同一個package中,可以多個檔案中定義init方法
  2. 在同一個go檔案中,可以重複定義init方法
  3. 在同一個package中,不同檔案中的init方法的執行按照檔名先後執行各個檔案中的init方法
  4. 在同一個檔案中的多個init方法,按照在程式碼中編寫的順序依次執行不同的init方法

下面看下測試的程式碼:

在當前目錄下新建main.go及testinit目錄,在testinit目錄下共有三個檔案:123.go、ini1.go、ini2.go,各個原始碼檔案分別如下:

123.go

package testinit

import "fmt"

func init(){
    fmt.Println("123init")
}

ini1.go

package testinit

import "fmt"

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

func init(){
    fmt.Println("init1-2")
}

ini2.go

package testinit

import "fmt"

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

main.go

package
main import ( _ "./testinit" "fmt" ) func main(){ fmt.Println("main") }

如上main.go中匯入testinit package,然後go build main.go,執行顯示如下:

這裡寫圖片描述

從執行的結構就能很清晰的看到,123、ini1、ini2三個檔案按照檔名執行,對於ini1.go中的兩個ini方法按照init方法編寫的先後順序執行,最後才執行的main方法!

紙上得來終覺淺,絕知此事要躬行!!