golang的package和其他語言的組織方式完全不同,剛開始接觸時,很不適應。
golang的package的特點:
1、go的package不局限於一個文件,可以由多個文件組成。
組成一個package的多個文件,編譯后實際上和一個文件類似,組成包的不同文件相互之間可以直接引用變量和函數,不論是否導出;
因此,組成包的多個文件中不能有相同的全局變量和函數(這里有一個例外就是包的初始化函數:init函數,下面還有討論)
2、go不要求package的名稱和所在目錄名相同,但是你最好保持相同,否則容易引起歧義。因為引入包的時候,go會使用子目錄名作為包的路徑,而你在代碼中真正使用時,卻要使用你package的名稱。
3、每個子目錄中只能存在一個package,否則編譯時會報錯。
4、go的package是以絕對路徑GOPATH來尋址的,不要用相對路徑來import
關於package的初始化函數init的說明:(主要參考oygg2008大俠在某貼中的回復,我經過試驗確實如此)
每個package中應該是每個init都會被調用,且順序固定
1、對同一個go文件的init()調用順序是從上到下的
2、對同一個package中不同文件是按文件名字符串比較“從小到大”順序調用各文件中的init()函數,對於
3、對不同的package,如果不相互依賴的話,按照main包中"先import的后調用"的順序調用其包中的init()
4、如果package存在依賴,則先調用最早被依賴的package中的init()