有關golang package中init方法的多處定義及執行順序問題
阿新 • • 發佈:2019-02-12
在不瞭解這個問題之前,在網上搜索一下竟然搜出了兩個完全相反的結果,所以打算自己測試下這個問題。
首先給出結論:
- 在同一個package中,可以多個檔案中定義init方法
- 在同一個go檔案中,可以重複定義init方法
- 在同一個package中,不同檔案中的init方法的執行按照檔名先後執行各個檔案中的init方法
- 在同一個檔案中的多個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方法!
紙上得來終覺淺,絕知此事要躬行!!