Как я могу "запустить" проект с несколькими файлами в основном пакете?

В настоящее время у меня есть один файл в моем основном пакете, который называется main.go. Как разделить содержимое main.go на несколько файлов, не создавая отдельный пакет, потому что код нельзя использовать повторно.

Мне нужна структура каталогов, подобная этой:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

func Bar() {
    fmt.Println("Bar")
}

Затем в main.go

package main

func main() {
    Bar()
}

Но go run main.go дает мне:

# command-line-arguments
./main.go:4:2: undefined: Bar

Ответ 1

Обновление от 26 июля 2019 года

go run .

Оригинальный ответ

Код выше на самом деле работает. Проблема была в том, что мне нужно было бежать

go run *.go

вместо

go run main.go

Ответ 2

Обновление от августа 2018 года с Go 1.11, раздел "Выполнить" гласит:

Команда go run теперь позволяет использовать один путь импорта, имя каталога или шаблон, соответствующий одному пакету.
Это позволяет go run pkg или go run dir, что наиболее важно go run .


Оригинальный ответ январь 2015

Как упомянуто в "Как скомпилировать программу Go, состоящую из нескольких файлов?", go run ожидает список файлов, так как он "компилирует и запускает пакет main, содержащий именованные исходные файлы Go ".
Таким образом, вы можете разделить пакет main на несколько файлов с помощью go run.

Это отличается от go build/go install, в которых ожидаются имена пакетов (а не имена файлов).
Простой go build создаст исполняемый файл, названный в честь родительской папки.

Обратите внимание, что, как иллюстрирует этот поток, go run *.go не будет работать в сеансе Windows CMD, поскольку оболочка не выполняет расширение с подстановочными знаками.

Ответ 3

Как уже упоминалось, вы можете сказать go run *.go, но для Windows вы можете просто перечислить файлы скриптов (так как *.go не будет работать) - go run main.go other.go third.go

Ответ 4

Для Windows установите Cygwin и используйте его вместо командной строки. "go run *.go" будет работать тогда.

Ответ 5

Если вы пытаетесь запустить несколько файлов на локальном хосте, используя gorilla mux в go согласно последней версии (1.11). Попробуйте использовать любую из следующих 2 команд.

  1. go install && FolderName -port 8081.

  2. go build &&./FolderName -port 8081.

Убедитесь, что вы находитесь в исходной папке, т.е. перейдите в /src/FolderName, прежде чем выполнять команду в Терминале.

Ответ 6

На мой взгляд, лучший ответ на этот вопрос скрыт в комментариях к верхнему ответу.

Просто запустите это:

go run .

Это запустит все файлы в основном пакете, но не выдаст сообщение об ошибке, подобное

go run: cannot run *_test.go files (main_test.go)

Слава @BarthesSimpson