2015-10-06 2 views
2

Я написал приложение для простого перехода и отформатировал его в нескольких пакетах.Как обменять переменные между пакетами в go-lang

+main 
+controllers 
+handlers 
+commons 
+utils 

Я запускаю сервер в основном пакете и задаю параметры сервера для чтения при запуске.

Я не буду использовать эти параметры, такие как свойства БД из пакета общих прав. Я не могу импортировать основной пакет в 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). Он используется в раме revel https://github.com/revel/revel.

+0

Является ли revel решением другой, более сложной проблемы? Просто потому, что есть «кувалда», нам не нужно его использовать :-) – gbulmer