2015-10-06 49 views
2

我寫了一個簡單的go應用程序並將其格式化爲多個包。如何在程序包中共享變量go-lang

+main 
+controllers 
+handlers 
+commons 
+utils 

我在主包中啓動服務器並在啓動時讀取服務器特定參數。

我不會使用這些參數,例如來自commons包的DB屬性。我不能將主包導入到commons的原因commons是一個依賴於控制器,處理程序這是一個依賴於主。所以這會導致循環導入。

我們該如何處理這種情況呢?是否有可能只讀一次配置,並在需要時在commons包內引用它?例子會很有幫助。

+2

選擇一個不導入其他軟件包的軟件包,這樣所有軟件包都可以導入它。並將共享變量放入其中。而'main'軟件包也可以訪問它來存儲啓動時讀取的參數。 – icza

+0

對於單個應用程序,你可能不應該擁有那麼多獨立的包。這些年來,在社區中一直存在很多關於此的喋喋不休,但是對於一個具有主要軟件包主幹的二進制文件來說,你可能會更好,只是將其他軟件包分離出來,而這些軟件包顯然可以在不同的項目中重複使用。這裏有一些進一步的討論(https://forum.golangbridge.org/t/organizing-go-code/1110/6)。 – AndrewN

+0

假設你遵循AndrewN的建議(KISS),並且現在避免額外的包結構,你可以使用標誌包從命令行讀取參數嗎?這似乎解決了所述的問題。 AFAIK,旗包可以從任何包中調用(不是很可愛?),而不僅僅是主要的,所以如果關鍵是參數在一個共享的包中,而不是主要的,那麼從那裏開始工作。 – gbulmer

回答

1

你可以使用一個配置包,當你需要使用一個配置變量時,你可以發送到另一個結構到不同的包中。

main() { 
    config := config{} 
    user = NewUser(config) 
    ... 
} 

我推薦給你檢查配置狂歡包(https://github.com/revel/config)。它被用於狂歡框架https://github.com/revel/revel

+0

是否陶醉於解決另一個更復雜的問題?只是因爲有'大錘',我們不需要使用它:-) – gbulmer