golang 中的 init 和 main函式

2021-10-02 04:35:56 字數 1890 閱讀 6460

首先我們看乙個例子:init函式:

init 函式可在package main中,可在其他package中,可在同乙個package**現多次。

main函式

main 函式只能在package main中。

執行順序

golang裡面有兩個保留的函式:init函式(能夠應用於所有的package)和main函式(只能應用於package main)。這兩個函式在定義時不能有任何的引數和返回值。

雖然乙個package裡面可以寫任意多個init函式,但這無論是對於可讀性還是以後的可維護性來說,我們都強烈建議使用者在乙個package中每個檔案只寫乙個init函式。

go程式會自動呼叫init()和main(),所以你不需要在任何地方呼叫這兩個函式。每個package中的init函式都是可選的,但package main就必須包含乙個main函式。

程式的初始化和執行都起始於main包。

如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。有時乙個包會被多個包同時匯入,那麼它只會被匯入一次(例如很多包可能都會用到fmt包,但它只會被匯入一次,因為沒有必要匯入多次)。

當乙個包被匯入時,如果該包還匯入了其它的包,那麼會先將其它包匯入進來,然後再對這些包中的包級常量和變數進行初始化,接著執行init函式(如果有的話),依次類推。

等所有被匯入的包都載入完畢了,就會開始對main包中的包級常量和變數進行初始化,然後執行main包中的init函式(如果存在的話),最後執行main函式。下圖詳細地解釋了整個執行過程: 

首先我們看乙個例子:

**結構:

**很簡單,只是一些簡單的輸出

lib1

lib2

libmain init

libmian main

輸出的順序與我們上面圖給出的順序是一致的

那我們現在就改動乙個地方,lib1包匯入lib2,main包不管

lib1

package initlib1

import (

"fmt"

_ "golangtraining/initlib2")

func init()

輸出:

lib2

lib1

libmain init

libmian main

main包以及lib1包都匯入了lib2,但是只出現一次,並且最先輸出,

說明如果乙個包會被多個包同時匯入,那麼它只會被匯入一次,而先輸出lib2是因為main包中匯入lib1時,lib1又匯入了lib2,會首先初始化lib2包的東西

golang中的init函式和main函式

main 函式只能在package main中。init 函式可在package main中,可在其他package中,可在同乙個package中出現多次。golang裡面有兩個保留的函式 init函式 能夠應用於所有的package 和main函式 只能應用於package main 這兩個函式在...

iOS中init和initialize的特點

在nsobject.h中有兩個類方法 void load void initalize initialize和load,我們並不需要在這兩個方法的實現中使用super呼叫父類的方法。load不像普通方法一樣遵守繼承規則,當自己的類沒有實現load方法時,不管超類是否實現,自己都不會載入load方法,...

Golang遍歷map的同時併發修改map的值

通過複製map解決問題 後記如題,有個邏輯設計,在遍歷map的同時需要併發的修改map的值 先說下解決,那就是把map重新複製乙份,不是同乙個map自然也就不存在併發安全和死鎖的問題了,但是因為不是同乙個map了,自然是需要注意資料還是否有效的問題了。這個可以通過加鎖之後的再次判斷來解決。併發的讀寫...