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?

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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.