2013-06-05 4 views
11

This repo hat 3 Go-Dateien, die alle mit "package lumber" beginnen. dieses Paket nutzen, soll ich dies meine GOROOT und einfach inWie funktionieren Pakete mit mehreren Dateien in Golang?

import lumber 

in meinem Programm setzen. Wie verbinden sich Variablen und Typen in diesem Paket über mehrere Dateien miteinander? Wie weiß der Go-Compiler, welche Datei zuerst zu lesen ist?

Falls ich das Paket lesen möchte, wo soll ich anfangen zu lesen, um das Paket zu verstehen? Was genau ist der Fluss der Dinge hier?

+0

@elithrar: Nicht wahr. Dateiumfang und Paketumfang sind unterschiedliche Bereiche. Zum Beispiel haben Importe nur den Paketumfang, so dass die Verkettung aller Quelldateien eines Pakets im allgemeinen Fall nicht funktioniert. – zzzz

+0

@jnml okay, so ist es im Grunde wie alle Dateien zu einer einzigen großen Datei verkettet, mit den in der unten angegebenen Link angegebenen Bereichsregeln, richtig? – pymd

+0

@nomad: Ich denke nicht. Import-Qualifizierer sind Dateibereiche und können nicht reproduziert werden, indem die Dateien zu einem zusammengefügt werden. IOW zum Beispiel kann der Bezeichner 'template' auf das Paket 'text/template' in einer Datei verweisen, aber auf 'html/template' in einer anderen Datei. Dieser Bereich kann nicht in den Paketbereich "gehoben" werden. – zzzz

Antwort

15

Nein, du bist nicht "sollte dies in meinem GOROOT". Sie sollen

$ go get github.com/jcelliott/lumber 

ausführen, die das Repository in $GOPATH/src/github.com/jcelliott/lumber klonen werden. Dann können Sie das Paket verwenden, indem Sie es in Ihrem Code als

import "github.com/jcelliott/lumber" 

über die Scoping-Regeln importieren: Declarations and scope

22

Um auf jnml Antwort zu erarbeiten:

Wenn Sie import "foo/bar" in Ihrem Code verwenden, sind Sie bezieht sich nicht auf die Quelldateien (die sich in $GOPATH/src/foo/bar/ befinden).

Stattdessen verweisen Sie auf eine kompilierte Paketdatei unter $GOPATH/pkg/$GOOS_$GOARCH/foo/bar.a. Wenn Sie Ihren eigenen Code erstellen und der Compiler feststellt, dass das foo/bar-Paket noch nicht kompiliert wurde (oder veraltet ist), wird dies automatisch für Sie erledigt.

Dies geschieht, indem * alle relevanten Quelldateien im Verzeichnis $GOPATH/src/foo/bar zusammengestellt und in eine einzige bar.a Datei zusammengefasst werden, die im Verzeichnis pkg installiert wird. Die Kompilation wird dann mit Ihrem eigenen Programm fortgesetzt.

Dieser Prozess wird für alle importierten Pakete und Pakete, die von diesen importiert werden, bis in die Abhängigkeitskette wiederholt.

*) Wie die Dateien sortiert werden, hängt davon ab, wie die Datei selbst benannt ist und welche Art von Build-Tags darin enthalten sind.

Für ein tieferes Verständnis, wie dies funktioniert, beziehen Sie sich auf die build docs.

+0

danke dir so sehr. Das hat viele Zweifel ausgeräumt. – pymd