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


150

Наразі в моєму основному пакеті є один файл, який називається 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

Відповіді:


204

Оновлення 26 липня 2019 року (для переходу> = 1,11)

go run .

Оригінальна відповідь

Код вище насправді працює. Проблема була в тому, що мені потрібно було бігти

go run *.go

замість

go run main.go

6
Якщо у вас *_test.goв папці немає. Тоді вам потрібно (1) shopt -s ext globі (2) go run !(*_test).go.
getWeberForStackExchange

а що з тими, хто вживає аппенгін?
goodies4uall

Я спробував, go run ./cmd/myCmd/...і це спрацювало на мене. Можливо, це правильний спосіб, коли є _test.goфайли?
VinGarcia

go run ../your_folderзсередини для мене працює робоча папка
Енді

3
Просто зробітьgo run .
BarthesSimpson

66

Оновлення серпня 2018 року з Go 1.11 , у розділі "Виконати" зазначено:

Тепер go runкоманда дозволяє отримати єдиний шлях імпорту, ім'я каталогу або шаблон, що відповідає одному пакунку.
Це дозволяє go run pkgабо go run dir, що найголовнішеgo run .


Оригінальна відповідь січня 2015 року

Як згадується у " Як скласти програму Go, що складається з декількох файлів? ", go runОчікує список файлів, оскільки вона "компілює та запускає mainпакет, що містить названі файли Go source".
Тож ви, звичайно, можете розділити mainпакунок на кілька файлів go run.

Це відрізняється від того, від go build/go installчого очікують назви пакетів (а не назвати імена файлів).
Простий go buildстворив би виконуваний файл, названий на честь батьківської папки.

Зауважте, що, як показано в цій темі , go run *.goне працюватиме в сесії CMD Windows, оскільки оболонка не розширює підстановку .


1
Чи є вирішення для запуску декількох файлів go за runдопомогою командного рядка Windows?
Лука

1
Дякую! Це допомогло мені тонну. Мені було цікаво, чому я не міг просто запустити код просто main.go, оскільки це був той самий пакет, але для мене це має сенс, чому вони цього не дозволяють.
Кріс

5

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


Так, це правильно. У Windows мені довелося бігатиgo run .
KTM

3

На мою думку, найкраща відповідь на це питання ховається в коментарях до верхньої відповіді.

Просто запустіть це:

go run .

Це запустить усі файли в основному пакеті, але не видасть повідомлення про помилку типу

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

Кудо до @BarthesSimpson


0

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


Я б запропонував MinGW для цього, але підхід правильний, якщо ви запитаєте мене. Я сумніваюся, що хтось міг би бути по-справжньому емоційно прихильнимcmd.exe
Олександр Кравець

0

Якщо ви намагаєтеся запустити декілька файлів у localhost, використовуючи gorilla mux in go, як свідчить остання версія (1.11). Спробуйте скористатися будь-якою з наступних 2 команд.

  1. перейдіть на встановлення && FolderName -port 8081.

  2. ідіть && ./FolderName -порт 8081.

Переконайтеся, що ви перебуваєте у вихідній папці, тобто go / src / FolderName, перш ніж виконувати команду в Терміналі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.