«Вершина», повторно объявленная в этом pacakge

#go #goland

#Вперед #голанд

Вопрос:

У меня есть проект Go в JetBrains goland, где все файлы доступны для запуска, но независимы друг от друга. Но чтобы сделать каждый runnnable, мне нужно сделать их основными в пакете. И у меня есть несколько «вершин», определенных в другом месте в другом файле, и Голанд жалуется на это. Но он все еще работоспособен, и это чисто жалоба Голанда.

Вопрос —

  1. Есть ли лучший способ упорядочить файлы?
  2. Если нет, есть ли способ отключить жалобу от Goland?

введите описание изображения здесь

Комментарии:

1. GoLand / VSCode или любой другой текстовый редактор IDE, который вы используете, будет рассматривать текущий каталог, открытый как корневой каталог go project; И будут применяться те же правила, которые запрещают вам повторно объявлять одни и те же переменные функции в пакете несколько раз

2. «все файлы доступны для выполнения, но независимы друг от друга» они не являются независимыми , если они находятся в одном каталоге / пакете. В Go у вас может быть по одному пакету на каталог, поэтому лучший способ справиться с проблемой — иметь столько каталогов, сколько вам нужно для отдельных запускаемых программ.

3. golang.org/doc/code.html#Organization

Ответ №1:

Вообще не рекомендуется работать с несколькими файлами, которые объявляют main() функцию в одном каталоге, в основном из-за проблем, подобных вашим.

Однако есть несколько способов решить эту проблему.

Вы можете использовать ограничения сборки, также известные как теги сборки, для разделения двоичных файлов во время сборки. При их использовании IDE также необходимо будет настроить с помощью Settings/Preferences | Build Tags amp; Vendoring . И, в зависимости от того, как вы создаете свое приложение, вам также может потребоваться настроить команду сборки, чтобы добавить к ней соответствующие теги.

Другой вариант, который я бы рекомендовал в этом случае, — переместить каждый main() определяющий файл в структуру, подобную этой:

 /repository_root
    /cmd
        /command1
            command1.go (file holds the `main()` func)
        /command2
            command2.go (file holds the `main()` func)
        /command3
            command3.go (file holds the `main()` func)
    /some
        /package
    some_file.go
    some_other_file.go
    ....
    some_other_file.go
  

В качестве примера этого макета вы можете взглянуть на Delve, который использует аналогичную структуру, но имеет только одну «команду» в cmd папке.

Наконец, иногда можно удалить дублирование и переместить его в общий файл, содержащий тип данных, но это не всегда идеально и может усложнить команду сборки, поскольку вам нужно указать все файлы, которые должны быть включены в процесс сборки.

Редактировать:

И вы можете прочитать больше о том, как организовать свои пакеты / приложения Go здесь

В этих статьях объясняется, как организовать ваши пакеты Go:

Чтобы больше узнать о философии проектирования пакетов Go: https://www.goinggo.net/2017/02/design-philosophy-on-packaging.html