Ich habe Schwierigkeiten beim Importieren einer lokalen Go-Datei in eine andere Go-Datei.
Meine Projektstruktur ist wie folgt
-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
Ich versuche a.go in b.go zu importieren. Ich habe folgendes versucht:
import "a"
import "github.com/xxxx/a"
Nichts davon hat funktioniert. Ich verstehe, dass ich mich in GOPATH einmischen muss, aber ich konnte es nicht richtig machen. Derzeit zeigt mein GOPATH auf samplego (/ workspace / samplego). Ich erhalte den folgenden Fehler
cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)
Wie funktioniert GOPATH, wenn diese Quelldateien in ein anderes Projekt / Modul importiert werden? Wären die lokalen Importe dann ein Problem? Was ist in diesem Fall die beste Vorgehensweise - ist es nur eine Go-Datei im Modul (mit zugehörigen Tests)?
package a
Erklärung oben haben.)package foo
) haben und müssen sich nicht direkt gegenseitig importieren. Diese Antwort behandelt dies etwas mehr für Go-Module, einschließlich des Importierens von Paketen in dasselbe Modul unter Go-Modulen.Antworten:
Eine beliebige Anzahl von Dateien in einem Verzeichnis ist ein einzelnes Paket. In einer Datei deklarierte Symbole stehen den anderen ohne
import
s oder Qualifikationsmerkmale zur Verfügung. Alle Dateien benötigen oben dieselbepackage foo
Deklaration (oder Sie erhalten eine Fehlermeldung vongo build
).Sie müssen
GOPATH
Set an das Verzeichnis , in dempkg
,src
undbin
Verzeichnissen befinden. Dies ist nur eine Frage der Präferenz, aber es ist üblich, (manchmal$HOME
) einen einzigen Arbeitsbereich für alle Ihre Apps zu haben , nicht einen pro App.Normalerweise wäre ein Github-Pfad
github.com/username/reponame
(nicht nurgithub.com/xxxx
). Also , wenn Sie haben wollenmain
und ein anderes Paket, können Sie etwas unter am Ende tutworkspace/src
wiegithub.com/ username/ reponame/ main.go // package main, importing "github.com/username/reponame/b" b/ b.go // package b
Beachten Sie, dass Sie immer mit dem vollständigen
github.com/...
Pfad importieren: Relative Importe sind in einem Arbeitsbereich nicht zulässig. Wenn Sie es leid sind, Pfade einzugeben, verwenden Siegoimports
. Wenn Sie damit auskommengo run
, ist es Zeit zu wechselngo build
:run
geht schlecht mit mehreren Dateien ummain
und ich habe mich nicht darum gekümmert zu testen, aber gehört (von Dave Cheney hier )go run
, dass schmutzige Abhängigkeiten nicht wiederhergestellt werden.Klingt so, als hätten Sie zumindest versucht, GOPATH auf das Richtige einzustellen. Wenn Sie also immer noch nicht weiterkommen, geben Sie möglicherweise genau an, wie Sie die Umgebungsvariable (den Befehl usw.) festgelegt haben und welchen Befehl Sie ausgeführt haben und welcher Fehler aufgetreten ist. Hier sind Anweisungen, wie es zu setzen (und die Einstellung dauerhaft machen) unter Linux / UNIX und hier ist der Rat des Go - Team auf Arbeitsplatz Setup . Vielleicht hilft beides nicht, aber werfen Sie einen Blick darauf und zeigen Sie zumindest, welcher Teil Sie verwirrt, wenn Sie verwirrt sind.
quelle
package main
habe allen Dateien im selben Verzeichnis dieselbe Deklaration hinzugefügt , aber ich habe denundefined
Fehler,main.go
dass Funktionen aus Dateien,controllers.go
die sich im selben Verzeichnis befinden, nicht angezeigt werden können .go run
, müssen Sie möglicherweise beide Dateinamen explizit übergeben oder zu einem Paket in Ihrem GOPATH wechseln undgo build
es eingeben . Überprüfen Sie auch, ob häufige Fehler vorliegen, die nicht mit der Paketstruktur zusammenhängen (z. B. ein Tippfehler). Wenn nichts davon es löst, würde ich eine neue Frage mit allen Details öffnen, die Sie können; Möglicherweise ist eine Menge Diskussion darüber erforderlich, wie Ihr Verzeichnis, Ihre Dateien usw. zu lösen sind, und da es sich speziell um Ihr Setup handelt, scheint eine neue Frage der beste Ort dafür zu sein.Es ist kein Import erforderlich, solange Sie beide deklarieren
a.go
undb.go
sich im selben Paket befinden. Anschließend können Siego run
mehrere Dateien erkennen mit:$ go run a.go b.go
quelle
in diesem Fall:
main.go import "./a"
Es kann die Funktion in a.go und b.go aufrufen, die mit Anfangsbuchstaben versehen ist.
quelle
Ich wollte nur etwas wirklich Grundlegendes, um einige Dateien aus dem Hauptordner zu verschieben, wie die Antwort von user2889485, aber seine spezifische Antwort hat bei mir nicht funktioniert. Es war mir egal, ob sie im selben Paket waren oder nicht.
Mein GOPATH-Arbeitsbereich ist
c:\work\go
und darunter habe ich/src/pg/main.go (package main) /src/pg/dbtypes.go (pakage dbtypes)
in
main.go
mirimport "/pg/dbtypes"
quelle