2014-11-14 4 views
6

erlebe ich ein Problem, wo go run main.go die Fehler produziert:Warum findet der Befehl "go run" keine zweite Datei im Hauptpaket?

# command-line-arguments 
./main.go:9: undefined: test 

jedoch die Befehle go build && ./goruntest Kompilierung und das Programm ganz gut laufen.

Die Ausgabe lautet:

Hi from test()

Hi from sameFileTest()

Hi from pkgtest.Test()

Hi from pkgtest.Test1()

ich das Verzeichnis haben wie so Aufstellmaße:

go/src/github.com/username/goruntest/ 
    pkgtest/ 
     pkgtest.go 
     pkgtest1.go 
    main.go 
    test2.go 

Hier ist der Code.

main.go

package main 

import (
    "fmt" 
    "github.com/username/goruntest/pkgtest" 
) 

func main() { 
    fmt.Println(test())   // main.go:9 
    fmt.Println(sameFileTest()) 
    fmt.Println(pkgtest.Test()) 
    fmt.Println(pkgtest.Test1()) 
} 

func sameFileTest() string { 
    return "Hi from sameFileTest()" 
} 

gotest1.go

package main 

func test() string { 
    return "Hi from test()" 
} 

pkgtest/pkgtest.go

package pkgtest 

func Test() string { 
    return "Hi from pkgtest.Test()" 
} 

pkgtest/pkgtest1.go

package pkgtest 

func Test1() string { 
    return "Hi from pkgtest.Test1()" 
} 

Ich verstehe, dass das Problem die zweite Datei als Teil package main ist und ich verstehe auch, dass es kein wirklicher Grund ist eine zweite Datei in main zu haben.

Meine Frage ist: Warumgo run nicht in der Lage ist, dieses Set-up, sondern Gebäude zu handhaben und laufen die ausführbaren funktioniert gut?

EDIT

enthalten eine zweite Datei in pkgtest

Ich verstehe auch, dass der Befehl go run main.go gotest1.go funktioniert, aber warum muss ich gotest1.go angeben?

Ich habe diese Details aus Gründen der Kürze ursprünglich weggelassen. Aber jetzt sehe ich, dass sie für die Frage wichtig sind.

+1

Es dokumentiert kompilieren und ausführen „die genannten Quelldateien“ auf der Kommandozeile die Bereitstellung übergeben. Wenn ich mich erinnere, werden möglicherweise importierte Pakete, die Änderungen hatten, nicht neu erstellt. Du willst wirklich "Build Build" machen, außer du machst ein wirklich einfaches Testskript. – twotwotwo

+0

@twotwotwo, stimme ich zu (+1), aber in diesem Fall hat die benannte Quelldatei eine Abhängigkeit, die 'go run' nicht in' package main' findet. Warum das? – robbmj

+0

Ich denke, sie haben dieses Verhalten gewählt, weil es Ihnen eine Sammlung von scriptähnlichen .go-Dateien in einem Verzeichnis zur Verfügung stellt und sie ohne Beeinträchtigung durch andere laufen lässt. – twotwotwo

Antwort

6

Versuchen Sie, alle relevanten Dateien zu go run

$ go help run 
usage: go run [build flags] [-exec xprog] gofiles... [arguments...] 

Run compiles and runs the main package comprising the named Go source files. 
A Go source file is defined to be a file ending in a literal ".go" suffix. 
+0

Fair genug +1, aber warum kann 'Go run' mehrere Dateien in' pkgtest' verarbeiten, aber keine Multiples in main? – robbmj

+0

naja, ganz einfach, b/c ist es in main.go importiert, sonst wäre 'go run' zu restriktiv, wenn es darum geht, jede einzelne go-source-datei zu liefern. In diesem Fall können Sie mit "go run" bestimmte Dateien, die Sie definiert haben, selektiv ausführen. Für den allgemeinen Fall, dass man einfach eine "Hauptdatei" über mehrere Dateien laufen lässt, fühlt sich dies einschränkend an, aber es erlaubt auch etwas Spielraum, wenn in diesem bestimmten Verzeichnis viel los ist und nur bestimmte Dateien laufen sollen. Ansonsten ist ein einfacher 'go build && ./ myapp' ein anderer Weg. – dskinner