Wie kann ich ein Projekt mit mehreren Dateien im Hauptpaket ausführen?


150

Ich habe derzeit eine einzelne Datei in meinem Hauptpaket namens main.go. Wie teile ich den Inhalt von main.goin mehrere Dateien auf, ohne ein separates Paket zu erstellen, da der Code nicht wiederverwendbar ist?

Ich möchte eine Verzeichnisstruktur wie diese:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Dann in main.go

package main

func main() {
    Bar()
}

Aber go run main.gogibt mir:

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

Antworten:


204

Update 26. Juli 2019 (für go> = 1.11)

go run .

Ursprüngliche Antwort

Der obige Code funktioniert tatsächlich. Das Problem war, dass ich rennen musste

go run *.go

anstatt

go run main.go

6
Es sei denn, Sie haben *_test.goin Ihrem Ordner. Dann müssen Sie (1) shopt -s ext globund (2) go run !(*_test).go.
getWeberForStackExchange

und was ist mit denen, die Appengine verwenden?
Goodies4uall

Ich habe es versucht go run ./cmd/myCmd/...und es hat bei mir funktioniert. Vielleicht ist dies der richtige Weg, wenn es _test.goDateien gibt?
VinGarcia

go run ../your_folderaus dem Arbeitsordner funktioniert für mich
Andy

3
Tun go run .
Sie es

66

Update August 2018 mit Go 1.11 , in einem Abschnitt "Ausführen" heißt es:

Der go runBefehl erlaubt jetzt einen einzelnen Importpfad, einen Verzeichnisnamen oder ein Muster, das einem einzelnen Paket entspricht.
Dies ermöglicht go run pkgoder go run dirvor allemgo run .


Ursprüngliche Antwort Jan. 2015

Wie unter " Kompilieren eines aus mehreren Dateien bestehenden Go-Programms? " Erwähnt , wird go runeine Liste von Dateien erwartet, da "das mainPaket mit den genannten Go-Quelldateien kompiliert und ausgeführt wird ".
So können Sie Ihr mainPaket sicher in mehrere Dateien mit aufteilen go run.

Das unterscheidet sich von go build/go installden erwarteten Paketnamen (und nicht Dateinamen).
Ein einfaches go buildwürde eine ausführbare Datei erzeugen, die nach dem übergeordneten Ordner benannt ist.

Beachten Sie, dass a, wie in diesem Thread dargestellt , go run *.goin einer Windows CMD-Sitzung nicht funktioniert, da die Shell keine Platzhaltererweiterung ausführt .


1
Gibt es eine Problemumgehung für das Ausführen mehrerer Go-Dateien runmithilfe der Windows-Eingabeaufforderung?
Luke

1
Vielen Dank! Das hat mir sehr geholfen. Ich habe mich immer wieder gefragt, warum ich den Code nicht einfach mit main.go ausführen konnte, da es dasselbe Paket war, aber es macht für mich irgendwie Sinn, warum sie das nicht zugelassen haben.
Chris

4

Wie bereits erwähnt, können Sie sagen, go run *.goaber für Windows können Sie nur die Skriptdateien auflisten (da * .go nicht funktioniert) -go run main.go other.go third.go


3

Meiner Meinung nach ist die beste Antwort auf diese Frage in den Kommentaren zur Top-Antwort versteckt.

Führen Sie einfach Folgendes aus:

go run .

Dadurch werden alle Dateien im Hauptpaket ausgeführt, es wird jedoch keine Fehlermeldung wie angezeigt

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

Ein großes Lob an @BarthesSimpson


0

Installieren Sie unter Windows Cygwin und verwenden Sie es anstelle der Eingabeaufforderung. "go run * .go" funktioniert dann.


Ich würde MinGW dafür vorschlagen, aber der Ansatz ist richtig, wenn Sie mich fragen. Ich bezweifle, dass jemand wirklich emotional verbunden sein könntecmd.exe
Aleksandr Kravets

0

Wenn Sie versuchen, mehrere Dateien auf localhost mit Gorilla Mux In Go gemäß der neuesten Version (1.11) auszuführen. Versuchen Sie es mit einem der folgenden 2 Befehle.

  1. Gehen Sie zu && FolderName -port 8081 installieren.

  2. gehe bauen && ./FolderName -port 8081.

Stellen Sie sicher, dass Sie sich im Quellordner befinden, dh gehen Sie zu / src / FolderName, bevor Sie den Befehl im Terminal ausführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.