2013-07-19 55 views
0

在Go中,您可以在給定的包中定義多個init函數,所有這些函數都將在執行之前以未指定的順序運行。具有多個這樣的功能的一個後果是不可能在正常代碼中調用或識別它們。例如,以下不會編譯:函數變量代表初始值

func main() { 
    fmt.Println(init) 
} 
func init() { } 

(見here的圍棋操場例子) 我的問題是 - 什麼優勢並能夠有多個初始化函數放棄,如果有沒有多個init函數,我們能夠引用或調用init函數嗎?

回答

1

的能夠有多個init功能優勢是國際海事組織主要在於它的地方提高可讀性:你可以寫旁邊被初始化的東西,而不是初始化函數遠程如果你將不得不集中所有的init功能一個。順便說一下,哪一個,甚至可以在不同的源文件中。

考慮假設的每個包的單個函數指針init函數也可能被禁止。原因在於,在某些情況下,使用這樣的指針會允許「無序」函數調用函數,即。 之前運行其依賴項 - 其他init功能在其他包。那會破壞某些guarantees

+0

嗯,這是關於能夠在其他包中調用init亂序的一個很好的觀點(儘管由於init沒有被導出,實際上它不會成爲問題)。 – joshlf

+0

此外,不能引用'init'將遞歸排除在外,這進一步簡化了這個問題。 – thwd