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.
@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
@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
@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