Warum wirft der Import lokaler Pakete in Go so viele Fragen auf?
\n\nWenn Sie jemals versucht haben, Go-Code in separate Dateien und Ordner zu organisieren, sind Sie bestimmt auf einen Fehler wie could not import "myproject/utils" gestoßen. Dies ist eines der häufigsten Probleme bei Anfängern in der Go-Entwicklung. Auf Stack Overflow hat die Frage "How to import local packages in go?" tausende Aufrufe – und das aus gutem Grund.
Im Gegensatz zu Python, wo es ausreicht, eine Datei daneben zu legen und import mymodule zu schreiben, erfordert Go eine klare Struktur und die richtige Konfiguration der Module. Aber wenn Sie diesen Mechanismus einmal verstanden haben, werden Sie feststellen, wie elegant er ist. Lassen Sie es uns ein für alle Mal klären.
Kurze Theorie: Wie Go Pakete versteht
\n\nBevor Sie Code schreiben, merken Sie sich drei Schlüsselprinzipien:
\n\n- \n
- Go ist eine Sprache mit einer strengen Modulstruktur. Jedes Verzeichnis ist ein Paket (package). \n
- Der Paketname muss nicht mit dem Ordnernamen übereinstimmen, aber es wird dringend empfohlen, dies aus Gründen der Lesbarkeit zu tun. \n
- Der Import lokaler Pakete erfolgt seit 2019 über Module (Go modules). Vergessen Sie
GOPATH– verwenden Siego mod. \n
Kommen wir nun zur Praxis.
\n\nSchritt 1: Projekt mit Modul erstellen
\n\nÖffnen Sie ein Terminal und erstellen Sie einen neuen Ordner für Ihr Projekt:
\n\nmkdir go-lokale-importe\ncd go-lokale-importe\n\n\nInitialisieren Sie nun das Modul. Der Modulname kann beliebig sein, aber es ist sinnvoll, einen Pfad zu verwenden, der eindeutig ist (z. B. ein Link zu einem Repository):
\n\ngo mod init github.com/ihr-benutzername/go-lokale-importe\n\n\nNach diesem Befehl erscheint im Ordner die Datei go.mod. Sie wird die Abhängigkeiten verwalten – sowohl lokale als auch externe.
Schritt 2: Lokales Paket erstellen
\n\nErstellen wir einen Ordner utils innerhalb des Projekts. Darin die Datei math.go:
mkdir utils\ncd utils\ntouch math.go\n\n\nÖffnen Sie utils/math.go und schreiben Sie:
package utils\n\n// Add gibt die Summe zweier Ganzzahlen zurück\nfunc Add(a, b int) int {\n return a + b\n}\n\n\nBeachten Sie: Die Funktion Add wird groß geschrieben. In Go bedeutet dies, dass sie exportiert (öffentlich) ist. Wenn Sie add schreiben, wäre sie privat und von anderen Paketen aus nicht zugänglich.
Schritt 3: Lokales Paket importieren und verwenden
\n\nGehen Sie zurück zum Stammverzeichnis des Projekts und erstellen Sie main.go:
cd ..\ntouch main.go\n\n\nInhalt von main.go:
package main\n\nimport (\n "fmt"\n "github.com/ihr-benutzername/go-lokale-importe/utils"\n)\n\nfunc main() {\n result := utils.Add(3, 5)\n fmt.Println("Summe:", result)\n}\n\n\nStarten Sie nun das Programm:
\n\ngo run main.go\n\n\nSie sollten Folgendes sehen:
\n\nSumme: 8\n\n\nEs funktioniert! Wenn Sie jedoch einen Fehler erhalten haben, lesen Sie den nächsten Abschnitt.
\n\nTypische Fehler und deren Lösung
\n\nFehler 1: "package is not in GOROOT"
\n\nSie sehen so etwas wie:
\npackage myproject/utils is not in GOROOT (/usr/local/go/src/myproject/utils)\n\nUrsache: Sie versuchen, ein Paket ohne Modul zu importieren. Go sucht es in der Standardbibliothek, nicht in Ihrem Projekt.
\nLösung: Stellen Sie sicher, dass sich go.mod im Stammverzeichnis des Projekts befindet. Wenn nicht, führen Sie go mod init modul-name aus.
Fehler 2: "undefined: utils.Add"
\n\nUrsache: Die Funktion wurde klein geschrieben (privat), oder Sie haben das Paket importiert, verwenden aber seinen Namen nicht.
\nLösung: Überprüfen Sie, ob alle benötigten Funktionen exportiert werden (groß geschrieben) und dass Sie auf sie mit dem Paketnamen zugreifen.