今天和同事探討一個Go語言的問題:golang
Go 包中的 init函數,是在程序啓動時執行一次,仍是在每處調用該 package 的地方都會調用一次?函數
當時以爲每處引用都調用不太合理,這其中的關鍵就是明白 init 會在什麼時候被調用。學習
因而翻開《Go語言實戰》一書,看到這段話,豁然開朗:spa
每一個包能夠包含任意多個 init 函數,這些函數都會在程序執行開始的時候被調用。全部被編譯器發現的 init 函數都會安排在 main 函數以前執行。init 函數用在設置包、初始化變量或其餘要在程序運行前優先完成的引導工做。get
這裏就說的很明確了,只要能被編譯器發現,都會在 main 函數以前執行,也就是不會在每次引用改包的時候都執行。編譯器
但要注意的是,一個包中的多個 init 函數的執行是不肯定的,不一樣包的 init 函數執行按照包導入的依賴關係決定執行順序。其餘更多關於 init 函數的知識,推薦學習這篇文章:五分鐘理解golang的init函數。it