2014-11-15 18 views
27

Ich habe Probleme beim Importieren einer lokalen Go-Datei in eine andere Go-Datei.Importieren von Dateien im selben Ordner

Meine Projektstruktur ist wie etwas unter

-samplego 
--pkg 
--src 
---github.com 
----xxxx 
-----a.go 
-----b.go 
--bin 

Ich versuche, innerhalb b.go. zu importieren a.go Ich folgendes versucht,

import "a" 
import "github.com/xxxx/a" 

Keiner dieser worked..I verstehe ich mit GOPATH einmischen müssen, aber ich konnte es nicht richtig machen. Derzeit meine GOPATH zeigt auf samplego (/ Arbeitsbereich/samplego) .Ich die folgenden Fehler

cannot find package "a" in any of: 
/usr/local/go/src/pkg/a (from $GOROOT) 
/workspace/samplego/src/a (from $GOPATH) 

auch erhalten, wie funktioniert GOPATH Arbeit, wenn diese Quelldateien in ein anderes Projekt/Modul importiert werden? Würden die lokalen Importe dann ein Problem sein? Was ist die beste Vorgehensweise in diesem Fall - ist es nur eine Go-Datei im Modul (mit zugehörigen Tests)?

+0

Eine beliebige Anzahl von Dateien in einem Verzeichnis Teil des gleichen Pakets von Anfang an sind. (Und sie müssen die gleiche "Paket a" -Deklaration an der Spitze haben.) – twotwotwo

+0

Danke @twotwotwo ... Könnten Sie mich wissen lassen, wie man das oben genannte Problem löst? Auch wenn wir mehrere Dateien in einem Paket haben, sollte der Import dem vollständigen Pfad folgen, zB. github.com/xxxx/a oder nur ein würde tun –

Antwort

28

Eine beliebige Anzahl von Dateien in einem Verzeichnis ist ein einzelnes Paket; Symbole, die in einer Datei deklariert sind, sind für die anderen ohne import s oder Qualifier verfügbar. Alle Dateien benötigen die gleiche package foo Erklärung oben (oder Sie erhalten einen Fehler von go build).

Sie müssen GOPATH in das Verzeichnis, in dem Ihre pkg, src und bin Verzeichnisse liegen. Dies ist nur eine Frage der Präferenz, aber es ist üblich, einen einzigen Arbeitsbereich für alle Ihre Apps zu haben (manchmal $HOME), nicht einen pro App.

Normalerweise wäre ein Github-Pfad github.com/username/reponame (nicht nur github.com/xxxx). relativ Einfuhren nicht in einem Arbeitsbereich erlaubt: Also, wenn Sie main und ein anderes Paket haben wollen, können Sie etwas unter workspace/src wie

github.com/ 
    username/ 
    reponame/ 
     main.go // package main, importing "github.com/username/reponame/b" 
     b/ 
     b.go // package b 

Hinweis Sie immer importieren mit dem vollen github.com/... Pfad am Ende tun. Wenn Sie keine Schreibpfade mehr brauchen, verwenden Sie goimports. Wenn Sie mit go run auskommen, ist es Zeit, zu go build zu wechseln: run Angebote schlecht mit multiple-file main s und ich habe nicht die Mühe zu testen, aber gehört (von Dave Cheney here) go run nicht schmutzige Abhängigkeiten neu aufzubauen.

Klingt, als ob Sie zumindest versucht haben, GOPATH auf das richtige zu setzen. Wenn Sie also immer noch stecken bleiben, können Sie genau die Umgebungsvariable (den Befehl usw.) eingeben und welchen Befehl Sie ausgeführt haben Welcher Fehler ist passiert? Here are instructions on how to set it (and make the setting persistent) under Linux/UNIX und here is the Go team's advice on workspace setup. Vielleicht hilft beides nicht, aber werfen Sie einen Blick darauf und weisen Sie zumindest darauf hin, welcher Teil Sie verwirrt, wenn Sie verwirrt sind.

+1

goimports war ziemlich hilfreich :) –

+0

Wenn Sie Probleme beim Ausführen mehrerer Dateien im Hauptpaket haben, finden Sie unter [diese Antwort] (http://stackoverflow.com/a/28081554/616644). –

8

./main.go (im Paket main)
./a/a.go (im Paket a)
./a/b.go (in Paket A)

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

Es kann die Funktion in der a.go und b.go, dass mit dem ersten Buchstaben Caps aufrufen.

0

Es ist kein Import erforderlich, solange Sie sowohl a.go als auch b.go im selben Paket deklarieren. Dann können Sie go run verwenden mit mehreren Dateien zu erkennen:

$ go run a.go b.go 
+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/19039597) –

Verwandte Themen