Fehler "Paket kann nicht geladen werden: Paket my_prog: Pakete my_prog und main gefunden"

75

In meinem GOPATH habe ich so etwas:

/bin/
/pkg/
/src/
/src/my_prog/
/src/my_prog/main.go
/src/my_prog/d_interface.go
/src/my_prog/d_struct_that_implements_the_interface.go

In habe main.goich package main, in d_interface.gound d_struct_that_implements_the_interface.goich habe package my_prog.

Wenn ich es versuche, go build my_progerhalte ich den folgenden Fehler:

can't load package: package my_prog: found packages my_prog (d_interface.go) and main (main.go) in C:\dev\Code\Go\src\my_prog

Bedeutet dies, dass jede Datei, zu der sie gehört, package mainin einem eigenen Ordner abgelegt werden sollte? Wenn ja, was ist der Grund dafür?

TheTeaMan
quelle

Antworten:

77

Ja, jedes Paket muss in einem eigenen Verzeichnis definiert werden.

Die Quellstruktur wird unter Schreiben von Go-Code definiert .

Ein Paket ist eine Komponente, die Sie in mehr als einem Programm verwenden können, die Sie veröffentlichen, importieren, von einer URL abrufen usw. können. Daher ist es sinnvoll, ein eigenes Verzeichnis zu haben, so wie ein Programm ein Verzeichnis haben kann.

Denys Séguret
quelle
Ja, aber qualifiziert sich das Hauptpaket als unabhängiges Paket? Nach meinem Verständnis ist das Paket main eine Eigenart der Sprache, die den Einstiegspunkt bietet (ähnlich wie die Java-Klassen mit dem öffentlichen statischen main).
TheTeaMan
Ja, so funktioniert es. In der Praxis habe ich nur sehr wenig Code in mein "Haupt" -Paket eingefügt, nur den, der nicht in anderen Programmen verwendet werden kann.
Denys Séguret
8
Es ist ziemlich ärgerlich, ehrlich zu sein. Ich sehe keinen Grund, den Haupteinstiegspunkt vom Rest des Programms zu trennen. Ich werde diese Antwort akzeptieren.
TheTeaMan
Wenn ich ein Programm erstelle, habe ich oft viele kleine Dienstprogramme, die dieselben Daten / Modelle / usw. verwenden. Es ist praktisch, alles in Paketen zu zerlegen und alle Programme sehr klein zu halten und diese Pakete zu verwenden. Übrigens können Sie ein wenig warten, bevor Sie eine Antwort annehmen, damit andere Benutzer einen Anreiz haben, Ihnen andere (möglicherweise bessere) Antworten zu geben.
Denys Séguret
2
Ich versuche noch nichts zu installieren, nur das Programm zu erstellen. Das Programm ist von beiden Paketen abhängig. Ich fand heraus, dass /src/my_prog/das Einfügen des Hauptpakets und des my_prog-Pakets /src/my_prog/my_prog/funktioniert.
TheTeaMan
17

Wenn Sie nur versuchen, die Datei main.go in mehrere Dateien aufzuteilen, nennen Sie die anderen Dateien einfach "package main", solange Sie nur die Hauptfunktion in einer dieser Dateien definieren gehen.

dkinzer
quelle
2

Stellen Sie sicher, dass Ihr Paket in Ihrem $GOPATHVerzeichnis oder bereits in Ihrem Arbeitsbereich / Paket installiert ist .

Zum Beispiel: Wenn ja $GOPATH = "c:\go", stellen Sie sicher, dass das Paket darin istC:\Go\src\pkgName

Muhammad Soliman
quelle