Go語言init函數(shù)詳解
Go init函數(shù)詳解
init()函數(shù)會在每個包完成初始化后自動執(zhí)行,并且執(zhí)行優(yōu)先級比main函數(shù)高。init 函數(shù)通常被用來:
- 對變量進行初始化
- 檢查/修復程序的狀態(tài)
- 注冊
- 運行一次計算
包的初始化
為了使用導入的包,首先必須將其初始化。初始化總是以單線程執(zhí)行,并且按照包的依賴關(guān)系順序執(zhí)行。這通過Golang的運行時系統(tǒng)控制,如下圖所示:
- 初始化導入的包(遞歸導入)
- 對包塊中聲明的變量進行計算和分配初始值
- 執(zhí)行包中的init函數(shù)

initial.go
package main
import "fmt"
var _ int64=s()
func init(){
fmt.Println("init function --->")
}
func s() int64{
fmt.Println("function s() --->")
return 1
}
func main(){
fmt.Println("main --->")
}
執(zhí)行結(jié)果
function s() --->
init function --->
main --->
即使包被導入多次,初始化只需要一次。
特性
init函數(shù)不需要傳入?yún)?shù),也不會返回任何值。與main相比而言,init沒有被聲明,因此也不能被引用。
package main
import "fmt"
func init(){
fmt.Println("init")
}
func main(){
init()
}
在編譯上面的函數(shù)時,會出錯“undefined:init”。
每個源文件中可以包含多個init函數(shù),記得《the way to go》中寫的是每個源文件只能包含一個init函數(shù),這有點出入,所以下面驗證下。
package main
import "fmt"
func init(){
fmt.Println("init 1")
}
func init(){
fmt.Println("init2")
}
func main(){
fmt.Println("main")
}
/*執(zhí)行結(jié)果:
init1
init2
main */
從上面的例子中,可以看出每個源文件可以包含多個init函數(shù)。
init函數(shù)常用的一個例子就是用來設置初始表達式的值。
var precomputed=[20]float64{}
func init(){
var current float64=1
precomputed[0]=current
for i:=1;i<len(precomputed);i++{
precomputed[i]=precomputed[i-1]*1.2
}
}
因為上面代碼中不可能用for循環(huán)來作為precomputed的值(這是一句聲明),因此可以用init函數(shù)來解決這個問題。
Go包導入規(guī)則的副作用
Go要求非常嚴格,不允許引用不使用的包。但是有時你引用包只是為了調(diào)用init函數(shù)去做一些初始化工作。此時空標識符(也就是下劃線)的作用就是為了解決這個問題。
import _ "image/png"
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
小學生也能看懂的Golang異常處理recover panic
在其他語言里,宕機往往以異常的形式存在,底層拋出異常,上層邏輯通過 try/catch 機制捕獲異常,沒有被捕獲的嚴重異常會導致宕機,go語言追求簡潔,優(yōu)雅,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常2021-09-09
Go返回int64類型字段超出javascript Number范圍的解決方法
這篇文章主要介紹了Go返回int64類型字段超出javascript Number范圍的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
深入探索Go語言中的高效數(shù)據(jù)結(jié)構(gòu)堆
堆,作為一種基本的數(shù)據(jù)結(jié)構(gòu),以其在優(yōu)先隊列和排序算法中提供高效解決方案的能力而聞名。在本文中,我們將深入探討堆的內(nèi)部工作原理,包括其特性、實現(xiàn)細節(jié)以及在現(xiàn)代編程中的應用2008-06-06

