Это неправильно дублировать "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:

Компилировать пакеты и зависимости

Использование:

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()) на их собственные каталоги является решением.

Другие вопросы по тегам