Это неправильно дублировать "func main" в "package main" и почему это неправильно? - PullRequest
0 голосов
/ 15 апреля 2019

Пожалуйста, помогите мне понять, почему дубликат "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")
}

Я могу собрать / запустить это: go build / run main.go - исправить go build / run.- неправильно

1 Ответ

6 голосов
/ 15 апреля 2019

Вы не можете иметь один и тот же символ, объявленный дважды на уровне пакета в одном и том же пакете.

И если у вас есть 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

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

go run [build flags] [-exec xprog] package [arguments...]

Запускает компиляцию и запускает указанный основной пакет Go. Обычно пакет указывается в виде списка исходных файлов .go, но это также может быть путь импорта, путь файловой системы или шаблон, соответствующий одному известному пакету, как в «go run».или 'go run my / cmd'.

Также см. Что такое build build?

...