go語言中init函數用於套件(package)的初始化,該函數是go語言的重要特性,
#有下面的特徵:
1 init函數是用於程式執行前做套件的初始化的函數,例如初始化套件裡的變數等
2 每個套件可以擁有多個init函數
3 套件的每個原始檔案也可以擁有多個init函數
4 同一個套件中多個init函數的執行順序go語言沒有明確的定義(說明)
#5 不同套件的init函數按照套件導入的依賴關係決定該初始化函數的執行順序
6 init函數不能被其他函數調用,而是在main函數執行之前,自動被調用
下面這個範例摘自《the way to go》,os差異在應用程式初始化時被隱藏掉了,
var prompt = "Enter a digit, e.g. 3 " + "or %s to quit." func init() { if runtime.GOOS == "windows" { prompt = fmt.Sprintf(prompt, "Ctrl+Z, Enter") } else { // Unix-like prompt = fmt.Sprintf(prompt, "Ctrl+D") } }
下面的兩個go檔案示範了:
1 一個package或者是go檔可以包含多個init函數,
2 init函數是在main函數之前執行的,
3 init函數被自動調用,不能在其他函數中調用,顯式呼叫會報函數未定義
gprog.go程式碼
package main import ( "fmt" ) // the other init function in this go source file func init() { fmt.Println("do in init") } func main() { fmt.Println("do in main") } func testf() { fmt.Println("do in testf") //if uncomment the next statment, then go build give error message : .\gprog.go:19: undefined: init //init() }
ginit1.go程式碼,注意這個原始檔中有兩個init函數
package main import ( "fmt" ) // the first init function in this go source file func init() { fmt.Println("do in init1") } // the second init function in this go source file func init() { fmt.Println("do in init2") }
編譯上面兩個檔案:go build gprog.go ginit1.go
#編譯之後執行gprog.exe後的結果表明,gprog.go中的init函數先執行,然後執行了ginit1.go中的兩個init函數,然後才執行main函數。
E:\opensource\go\prj\hellogo>gprog.exe do in init do in init1 do in init2 do in main
註:《the way to go》中(P70)有下面紅色一句描述,意思是說一個go原始檔只能有一個init函數,
但是上面的ginit1. go中的兩個init函式編譯運行後都正常執行了,
因此這句話應該是筆誤。
4.4.5 Init-functions Apart from global declaration with initialization, variables can also be initialized in an init()-function. This is a special function with the name init() which cannot be called, but is executed automatically before the main() function in package main or at the start of the import of the package that contains it. Every source file can contain only 1 init()-function. Initialization is always single-threaded and package dependency guarantees correct execution order.
推薦:go影片教學
#以上是go語言的init函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!