Вы не можете иметь один и тот же символ, объявленный дважды на уровне пакета в одном и том же пакете.
И если у вас есть 2 файла в одной папке, оба с объявлением package main
, это именно то, чтоты делаешь.Вот почему ваша IDE жалуется: она пытается собрать / скомпилировать эти 2 файла как один пакет, так же, как пишет go build .
: это обозначает пакет в текущей папке, включая все исходные файлы.
go run main.go
и go run second.go
работает, потому что вы указываете файлы для сборки (точнее, один файл), а не пакеты.И наличие одного main.go
или second.go
в качестве пакета main
не нарушает вышеуказанное правило: каждый файл содержит только функцию main()
один раз.
Короче говоря: go run main.go
игнорирует second.go
.
Обычно, если вы хотите создать несколько приложений с несколькими функциями main()
в одном проекте, проще всего просто разместить различные функции main()
в разных папках, обычно внутрипапка cmd
.
См. команду Go:
Использование:
go build [-o output] [-i] [build flags] [packages]
Build компилирует пакеты, названные путями импорта, вместе с их зависимостями, но не устанавливает результаты.
Если аргументы для сборки являются списком.файлы go, build рассматривает их как список исходных файлов, указывающих один пакет.
Использование:
go run [build flags] [-exec xprog] package [arguments...]
Запускает компиляцию и запускает указанный основной пакет Go. Обычно пакет указывается в виде списка исходных файлов .go, но это также может быть путь импорта, путь файловой системы или шаблон, соответствующий одному известному пакету, как в «go run».или 'go run my / cmd'.
Также см. Что такое build build?