2015-09-28 32 views
2

我所擁有的文件:Golang初始化包內的訂單?

main/ 
    a.go 
    b.go 
    c.go 

a.go:

package main 
import "fmt" 

func init(){ 
    fmt.Println("a") 
} 

func main(){} 

b.go:

package main 
import "fmt" 

func init(){ 
    fmt.Println("b") 
} 

c.go:

package main 
import "fmt" 

func init(){ 
    fmt.Println("c") 
} 

按照什麼順序會字符串輸出?

+1

相關:[詞彙文件名稱順序是什麼意思?](http://stackoverflow.com/questions/31650965/what-does-lexical-file-name-order-mean) – icza

+1

雖然規範說構建系統被鼓勵「以詞彙順序提供文件名,這不是強制性的。如果您的文件在一個包中,那麼執行絕對命令似乎很容易,以確保一致的行爲。 – JimB

回答

3

將各個文件名傳遞給Go編譯器的順序。

Go spec說:「我們鼓勵建立系統呈現屬於同一個包中的詞彙文件名以編譯多個文件,」所以這是一個安全的賭注,go build正是這麼做的,而inits將在A-B-C的順序運行。

+4

爲了安全起見,我認爲每個文件都應該提供一個名爲'initA()','initB()'等的函數,其中一個文件應該以明確的順序調用它們。它的'init()'。作爲額外的獎勵和重要的一點,這將給讀者一個清晰的提示。 – kostix

+0

或者更好,如果您的初始化是依賴於順序的,請使這些依賴項明確。例如。如果你在一個文件中有'var a = fn()'而在另一個文件中有'var fn = func()int {return 42}',那麼'fn'將總是首先被初始化; https://play.golang.org/p/W6UdA_6gSa(換句話說,重命名其中一個'init'函數並在需要的地方從另一個函數調用它可能是有意義的)。 –