Это неправильно дублировать "func main" в "package main" и почему это неправильно?
Пожалуйста, помогите мне понять, почему дублирование "func main" в "package main" неверно. Ошибка в VC: "Главное объявление объявлено в этом блоке".
// $ tree
// .
// ├── main.go
// ├── second.go
// ```go build main.go```
// or
// ```go build .```
// file: main.go
package main
import (
"fmt"
)
func main() {
fmt.Println("this is file MAIN")
}
// file: second.go
package main
import (
"fmt"
)
func main() {
fmt.Println("this is file SECOND")
}
Я могу собрать / запустить это: иди build/run main.go - правильно иди build/run . - неправильно
2 ответа
Вы не можете иметь один и тот же символ, объявленный дважды на уровне пакета в одном и том же пакете.
И если у вас есть 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 build [-o output] [-i] [build flags] [packages]
Build компилирует пакеты, названные путями импорта, вместе с их зависимостями, но не устанавливает результаты.
Если аргументы для сборки представляют собой список файлов.go, сборка обрабатывает их как список исходных файлов, указывающих один пакет.
Скомпилируйте и запустите программу Go
Использование:
go run [build flags] [-exec xprog] package [arguments...]
Запустите компиляцию и запустите указанный основной пакет Go. Обычно пакет указывается в виде списка исходных файлов.go, но это также может быть путь импорта, путь файловой системы или шаблон, соответствующий одному известному пакету, как в "go run". или "беги мой / cmd".
Также смотрите Что идет сборка сборки?
В Go каталог — это пакет, а в пакете может быть только одна функция с заданным именем (за исключением особого случая — init()). Думайте обо всех ваших файлах .go в каталоге как о отдельных, но Go этого не делает. , он рассматривается как единый пакет, и этот пакет объявляет несколько функций, называемых main, что не разрешено.
Разделение их (функция main()) на их собственные каталоги является решением.