Jak mogę „uruchomić” projekt z wieloma plikami w głównym pakiecie?

150

Obecnie mam jeden plik w moim głównym pakiecie o nazwie main.go. Jak podzielić zawartość main.gona wiele plików bez tworzenia oddzielnego pakietu, ponieważ kodu nie można użyć ponownie.

Chcę mieć taką strukturę katalogów:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Następnie w main.go

package main

func main() {
    Bar()
}

Ale go run main.godaje mi:

# command-line-arguments
./main.go:4:2: undefined: Bar
Neil
źródło

Odpowiedzi:

204

Aktualizacja 26 lipca 2019 (dla go> = 1.11)

go run .

Oryginalna odpowiedź

Powyższy kod faktycznie działa. Problem polegał na tym, że musiałem biec

go run *.go

zamiast

go run main.go
Neil
źródło
6
Chyba że masz *_test.gow swoim folderze. Następnie musisz (1) shopt -s ext globi (2) go run !(*_test).go.
getWeberForStackExchange
a co z tymi używającymi appengine?
goodies4uall
Próbowałem go run ./cmd/myCmd/...i to zadziałało. Może to jest właściwy sposób, gdy są _test.gopliki?
VinGarcia
go run ../your_folderz wnętrza folderu roboczego działa dla mnie
Andy
3
Po prostu zróbgo run .
BarthesSimpson
66

Aktualizacja z sierpnia 2018 r. Wraz z wersją Go 1.11 w sekcji „Uruchom” :

Plik go runKomenda pozwala teraz pojedynczą ścieżkę importu, nazwę katalogu lub wzór pasujący jeden pakiet.
Pozwala to go run pkgalbo go run dir, co najważniejszego run .


Oryginalna odpowiedź styczeń 2015

Jak wspomniano w „ Jak skompilować program Go składający się z wielu plików? ”, go runOczekuje listy plików, ponieważ „kompiluje i uruchamia mainpakiet zawierający nazwane pliki źródłowe Go”.
Więc z pewnością możesz podzielić mainpakiet na kilka plików za pomocągo run .

To różni się od tego, go build/go installktóry oczekuje nazw pakietów (a nie nazw plików).
Prosty go builddałby plik wykonywalny nazwany na podstawie folderu nadrzędnego.

Zauważ, że, jak zilustrowano w tym wątku , a go run *.gonie działałby w sesji Windows CMD, ponieważ powłoka nie wykonuje ekspansji symboli wieloznacznych .

VonC
źródło
1
Czy istnieje obejście problemu uruchamiania wielu plików go za runpomocą wiersza polecenia systemu Windows?
Łukasz
1
Dzięki! To mi pomogło. Zastanawiałem się, dlaczego nie mogłem po prostu uruchomić kodu z samym main.go, skoro był to ten sam pakiet, ale wydaje mi się, że ma sens, dlaczego na to nie pozwolili.
Chris,
5

Jak wspomniano, możesz powiedzieć, go run *.goale w systemie Windows możesz po prostu wyświetlić listę plików skryptów (ponieważ * .go nie będzie działać) -go run main.go other.go third.go

Karl Penzhorn
źródło
Tak, to jest poprawne. W Windows musiałem uruchomićgo run .
KTM
3

Moim zdaniem najlepszą odpowiedź na to pytanie kryje się w komentarzach do górnej odpowiedzi.

Po prostu uruchom to:

go run .

Spowoduje to uruchomienie wszystkich plików w głównym pakiecie, ale nie wyświetli komunikatu o błędzie, takiego jak

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

Uznanie dla @BarthesSimpson

chim
źródło
0

W systemie Windows zainstaluj Cygwin i używaj go zamiast wiersza poleceń. Wtedy "go run * .go" będzie działać.

Alex Dvoretskiy
źródło
Sugerowałbym do tego MinGW, ale podejście jest właściwe, jeśli o mnie chodzi. Wątpię, czy ktokolwiek mógłby być naprawdę przywiązany emocjonalniecmd.exe
Aleksandr Kravets
0

Jeśli próbujesz uruchomić wiele plików na hoście lokalnym przy użyciu programu Gorilla mux w go zgodnie z najnowszą wersją (1.11). Spróbuj użyć dowolnego z następujących 2 poleceń.

  1. idź zainstaluj && nazwa_folderu - port 8081.

  2. idź budować && ./FolderName -port 8081.

Upewnij się, że jesteś w folderze źródłowym, tj. Go / src / FolderName przed wykonaniem polecenia w terminalu.

Bharath Kuppala
źródło