首先我們看乙個例子: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了,自然是需要注意資料還是否有效的問題了。這個可以通過加鎖之後的再次判斷來解決。併發的讀寫...