Go語言init函數(shù)詳解
Go init函數(shù)詳解
init()函數(shù)會在每個包完成初始化后自動執(zhí)行,并且執(zhí)行優(yōu)先級比main函數(shù)高。init 函數(shù)通常被用來:
- 對變量進(jìn)行初始化
- 檢查/修復(fù)程序的狀態(tài)
- 注冊
- 運(yùn)行一次計算
包的初始化
為了使用導(dǎo)入的包,首先必須將其初始化。初始化總是以單線程執(zhí)行,并且按照包的依賴關(guān)系順序執(zhí)行。這通過Golang的運(yùn)行時系統(tǒng)控制,如下圖所示:
- 初始化導(dǎo)入的包(遞歸導(dǎo)入)
- 對包塊中聲明的變量進(jìn)行計算和分配初始值
- 執(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 --->
即使包被導(dǎo)入多次,初始化只需要一次。
特性
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ù),這有點(diǎn)出入,所以下面驗(yàn)證下。
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ù)常用的一個例子就是用來設(shè)置初始表達(dá)式的值。
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 } }
因?yàn)樯厦娲a中不可能用for循環(huán)來作為precomputed的值(這是一句聲明),因此可以用init函數(shù)來解決這個問題。
Go包導(dǎo)入規(guī)則的副作用
Go要求非常嚴(yán)格,不允許引用不使用的包。但是有時你引用包只是為了調(diào)用init函數(shù)去做一些初始化工作。此時空標(biāo)識符(也就是下劃線)的作用就是為了解決這個問題。
import _ "image/png"
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
一文帶你了解Golang中interface的設(shè)計與實(shí)現(xiàn)
本文就來詳細(xì)說說為什么說?接口本質(zhì)是一種自定義類型,以及這種自定義類型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01golang如何設(shè)置Header Content-type
這篇文章主要介紹了golang如何設(shè)置Header Content-type問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

一文深入探索Go語言中的循環(huán)結(jié)構(gòu)

Go語言題解LeetCode724尋找數(shù)組的中心下標(biāo)

Go語言開發(fā)必知的一個內(nèi)存模型細(xì)節(jié)