站長資訊網
        最全最豐富的資訊網站

        go語言的init()方法有什么用

        在go語言中,init()方法用于包的初始化;初始化每個包后,會自動執行init()函數,并且執行優先級高于主函數的執行優先級。init()方法通常用于:1、變量初始化;2、檢查/修復狀態;3、注冊器;4、運行計算。init()函數在程序運行時,自動自動被調用執行,不能在代碼中主動調用它。不同包的init函數按照包導入的依賴關系決定該初始化函數的執行順序。

        go語言的init()方法有什么用

        本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

        Go init函數的詳細說明

        go語言中init函數用于包(package)的初始化,該函數是go語言的一個重要特性

        程序執行時導入包語句會自動觸發包內部init()函數的調用。

        初始化每個包后,會自動執行init()函數,并且執行優先級高于主函數的執行優先級。

        需要注意的是:init()函數沒有參數,也沒有返回值。

        init函數通常用于:

        • 變量初始化
        • 檢查/修復狀態
        • 注冊器
        • 運行計算

        init()函數在程序運行時,自動自動被調用執行,不能在代碼中主動調用它。

        包初始化執行的順序如下圖所示:

        go語言的init()方法有什么用

        結果是:

        10 Hello 沙河
        登錄后復制

        init()函數有下面的特點:

        • init函數是用于程序執行前做包的初始化的函數,比如初始化包里的變量等

        • 每個包可以擁有多個init函數

        • 包的每個源文件也可以擁有多個init函數

        • 同一個包中多個init函數的執行順序go語言沒有明確的定義(說明)

        • 不同包的init函數按照包導入的依賴關系決定該初始化函數的執行順序

        • init函數不能被其他函數調用,而是在main函數執行之前,自動被調用

        包初始化

        為了使用導入的程序包,必須首先對其進行初始化。初始化始終在單個線程中執行,并且以程序包依賴關系的順序執行。這由Golang的運行時系統控制,如下圖所示:

        • 初始化導入的包(遞歸導入)
        • 計算并為塊中聲明的變量分配初始值
        • 在包中執行初始化函數

        go語言的init()方法有什么用

        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 --->") }
        登錄后復制

        執行結果

        function s() —> init function —> main —>
        登錄后復制

        即使程序包被多次導入,初始化也只需要一次。

        特性介紹

        init函數不需要傳入參數,也不需要返回任何值。與main相比,init沒有聲明,因此無法引用。

        package main import "fmt" func init(){   fmt.Println("init") } func main(){   init() }
        登錄后復制

        編譯上述函數“undefined:init”時發生錯誤。

        每個源文件可以包含一個以上的init函數,請記住,寫在每個源文件中的“行進方式”只能包含一個init函數,這有點不同,因此進行下一個驗證。

        package main import "fmt" func init(){   fmt.Println("init 1") } func init(){   fmt.Println("init2") } func main(){   fmt.Println("main") } /* 實施結果: init1 init2 main */
        登錄后復制

        從上面的示例中,您可以看到每個源文件可以包含多個init函數。

        初始化函數的一個常見示例是設置初始表達式的值。

        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循環用作預先計算的值,所以可以使用init函數來解決此問題。

        Go套件匯入規則的副作用

        Go非常嚴格,不允許引用未使用的軟件包。但是有時您引用包只是為了調用init函數進行一些初始化。空標識符(即下劃線)的目的是解決此問題。

        import _ "image/png"
        登錄后復制

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲AV日韩精品久久久久久久| 精品亚洲一区二区| 九九精品成人免费国产片| 亚洲爆乳精品无码一区二区| 国产小视频国产精品| 久久Av无码精品人妻系列| 午夜精品久久久内射近拍高清| 国产精品第1页| 欧美日韩精品在线| 国产成人精品日本亚洲专| 久久99精品久久久久久hb无码| 亚洲无码日韩精品第一页| 久久国产精品视频| 国产成人精品免费视频大全| 国产精品视频分类一区| 精品久久久久久久久午夜福利| 欧美精品1区2区| 久久99精品久久久久久久久久| 亚洲精品第一国产综合境外资源| 国产亚洲精品精品国产亚洲综合 | 自拍偷在线精品自拍偷| 国内精品久久久久久不卡影院| 亚洲国产精品lv| 亚洲精品小视频| 欧美亚洲精品在线| 四虎成人www国产精品| 亚洲第一精品在线视频| 91精品国产综合久久四虎久久无码一级 | 国产精品毛片久久久久久久| 久久Av无码精品人妻系列| 亚洲精品午夜无码专区| 亚洲av无码乱码国产精品| 亚洲精品乱码久久久久久蜜桃不卡 | 一区二区三区日韩精品| 欧美成人精品一级高清片| 欧美一区二区精品久久| 91精品国产福利在线观看| 国产精品成人久久久久久久| 国产欧美日韩综合精品一区二区三区| 国产精品99在线播放| 精品久久久无码中文字幕|