Importieren von go-Dateien in denselben Ordner

84

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)?

g0c00l.g33k
quelle
Eine beliebige Anzahl von Dateien in einem Verzeichnis ist von Anfang an Teil desselben Pakets. (Und sie müssen die gleiche package aErklärung oben haben.)
Zwei
Danke @twotwotwo ... Können Sie mir mitteilen, wie ich das oben genannte Problem lösen kann? Wenn wir Multipe-Go-Dateien in einem Paket haben, sollte der Import dem vollständigen Pfad folgen, z. github.com/xxxx/a oder nur ein würde tun
g0c00l.g33k
Bei Go-Modulen sind Dateien im selben Verzeichnis immer noch Teil desselben Pakets, müssen immer noch denselben Paketnamen (z. B. 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.
typisch182

Antworten:

76

Eine beliebige Anzahl von Dateien in einem Verzeichnis ist ein einzelnes Paket. In einer Datei deklarierte Symbole stehen den anderen ohne imports oder Qualifikationsmerkmale zur Verfügung. Alle Dateien benötigen oben dieselbe package fooDeklaration (oder Sie erhalten eine Fehlermeldung von go build).

Sie müssen GOPATHSet an das Verzeichnis , in dem pkg, srcund binVerzeichnissen 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 nur github.com/xxxx). Also , wenn Sie haben wollen mainund ein anderes Paket, können Sie etwas unter am Ende tut workspace/srcwie

github.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 Sie goimports. Wenn Sie damit auskommen go run, ist es Zeit zu wechseln go build: rungeht schlecht mit mehreren Dateien um mainund 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.

zwei
quelle
1
goimports war sehr hilfreich :)
g0c00l.g33k
Wenn Sie Probleme beim Ausführen mehrerer Dateien im Hauptpaket haben, lesen Sie diese Antwort .
Rick Smith
Ich package mainhabe allen Dateien im selben Verzeichnis dieselbe Deklaration hinzugefügt , aber ich habe den undefinedFehler, main.godass Funktionen aus Dateien, controllers.godie sich im selben Verzeichnis befinden, nicht angezeigt werden können .
Ame
2
@AlexChaliy Wenn Sie verwenden go run, müssen Sie möglicherweise beide Dateinamen explizit übergeben oder zu einem Paket in Ihrem GOPATH wechseln und go buildes 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.
Zwei
40

Es ist kein Import erforderlich, solange Sie beide deklarieren a.gound b.gosich im selben Paket befinden. Anschließend können Sie go runmehrere Dateien erkennen mit:

$ go run a.go b.go
Jason Kao
quelle
14

./main.go (im
Hauptpaket ) ./a/a.go (im Paket a)
./a/b.go (im Paket a)

in diesem Fall:
main.go import "./a"

Es kann die Funktion in a.go und b.go aufrufen, die mit Anfangsbuchstaben versehen ist.

user2889485
quelle
0

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\gound darunter habe ich

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

in main.gomir import "/pg/dbtypes"

Dave Pile
quelle