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

159

В настоящее время в моем основном пакете есть один файл с именем 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
Нил
источник

Ответы:

215

Обновление 26 июля 2019 г. (для перехода> = 1.11)

go run .

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

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

go run *.go

вместо того

go run main.go
Нил
источник
8
Если только у вас *_test.goв папке. Затем вам нужно выполнить (1) shopt -s ext globи (2) go run !(*_test).go.
getWeberForStackExchange
а что насчет тех, кто использует appengine?
goodies4uall
Я попробовал, go run ./cmd/myCmd/...и у меня это сработало. Может это правильный путь при наличии _test.goфайлов?
VinGarcia
go run ../your_folderизнутри рабочая папка у меня работает
Энди
3
Just dogo run .
BarthesSimpson
67

Обновление августа 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создаст исполняемый файл с именем родительской папки.

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

VonC
источник
1
Есть ли обходной путь для запуска нескольких файлов go с runпомощью командной строки Windows?
Люк
1
Благодарность! Это мне очень помогло. Я все время задавался вопросом, почему я не могу просто запустить код только с main.go, поскольку это был тот же пакет, но для меня это имеет смысл, почему они не позволяют этого.
Крис
@Luke просто укажите оба файла через пробел.
xuiqzy
7

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

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

go run .

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

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

Престижность @BarthesSimpson

колокольчик
источник
5

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

Карл Пенжорн
источник
Да, это правильно. В windows мне пришлось бежатьgo run .
KTM
0

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

Алексей Дворецкий
источник
Я бы предложил MinGW для этого, но подход правильный, если вы спросите меня. Сомневаюсь, что кто-то может быть действительно эмоционально привязан кcmd.exe
Александр Кравец
0

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

  1. пойти установить && FolderName -port 8081.

  2. иди build && ./FolderName -port 8081.

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

Бхаратх Куппала
источник
0

Первый способ сделать это - запустить

go run *.go

Другой способ - создать exe-файл.

go build

Затем запустите этот файл .exe

./filename.exe
Нишант Радж
источник