Go meckert "undefined" für eine Funktion aus einer anderen Datei an? Wir klären auf

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

„Undefined“-Funktion in Go: Wie man Dateien miteinander bekannt macht und nicht verrückt wird

\n\n

Stellen Sie sich vor: Sie schreiben ein Go-Programm, teilen den Code in logische Dateien auf (z. B. main.go und helper.go), führen go run main.go aus – und der Compiler gibt eiskalt zurück: „undefined: MyFunction“. Kommt Ihnen bekannt vor? Diese Frage ist eine der beliebtesten auf Stack Overflow (tausende Aufrufe!), und heute werden wir sie ein für alle Mal klären.

\n\n

Warum sieht Go, das für seine Einfachheit bekannt ist, plötzlich die Funktion aus der benachbarten Datei nicht? Es liegt nicht an Magie, sondern an den strengen Regeln der Code-Organisation. Gehen wir alle Szenarien durch – vom klassischen Anfängerfehler bis zur korrekten Arbeit mit Modulen.

\n\n

Szenario 1: Der Klassiker – Beim Start vergessen, alle Dateien anzugeben

\n\n

Der häufigste Fall. Sie schreiben:

\n\n
// main.go\npackage main\n\nfunc main() {\n    printHello() // Fehler: undefined: printHello\n}\n
\n\n
// helper.go\npackage main\n\nimport "fmt"\n\nfunc printHello() {\n    fmt.Println("Hello!")\n}\n
\n\n

Und führen nur go run main.go aus. Go sieht helper.go nicht, weil Sie es nicht explizit angegeben haben. Die richtige Lösung:

\n\n
go run main.go helper.go\n// oder einfacher:\ngo run .\n
\n\n

Warum ist das so? Go scannt das Verzeichnis nicht automatisch – Sie müssen alle Dateien des Pakets auflisten. Der Befehl go run . führt den gesamten aktuellen Ordner als ein einziges Paket aus.

\n\n

Szenario 2: Unterschiedliche Pakete – Standardmäßig unsichtbar

\n\n

Eine weitere beliebte Falle ist der Versuch, eine Funktion aus einem anderen Paket ohne Import und Export aufzurufen.

\n\n
// main.go\npackage main\n\nfunc main() {\n    helper.DoSomething() // Fehler: undefined: helper\n}\n
\n\n
// helper/helper.go\npackage helper\n\nfunc DoSomething() {\n    // ...\n}\n
\n\n

Hier gibt es zwei Probleme:

\n
    \n
  • Die Dateien befinden sich in unterschiedlichen Paketen (main und helper).
  • \n
  • Die Funktion DoSomething ist nicht exportiert (beginnt mit einem Kleinbuchstaben).
  • \n
\n\n

Die korrigierte Version:

\n\n
// main.go\npackage main\n\nimport "yourmodule/helper"\n\nfunc main() {\n    helper.DoSomething() // Funktioniert!\n}\n
\n\n
// helper/helper.go\npackage helper\n\nfunc DoSomething() { // Großbuchstabe!\n    // ...\n}\n
\n\n

Merken Sie sich: In Go werden nur Entitäten mit Großbuchstaben exportiert. Ein Kleinbuchstabe bedeutet privat für das Paket.

\n\n

Szenario 3: Probleme mit Modulen und GOPATH

\n\n

Wenn Sie den alten Stil (GOPATH) verwenden oder das Modul falsch initialisiert haben, kann Go Ihre Dateien möglicherweise nicht finden, selbst wenn sie im selben Ordner sind.

\n\n

Überprüfen Sie:

\n
    \n
  1. Gibt es eine Datei go.mod im Stammverzeichnis des Projekts? Wenn nicht, erstellen Sie eine: go mod init Modulname.
  2. \n
  3. Befindet sich Ihr Projekt innerhalb von $GOPATH/src ohne Modul? Dies ist ein Legacy-Modus, der verwirren kann.
  4. \n
  5. Stellen Sie sicher, dass alle Dateien im Ordner das gleiche package haben (außer Testdateien mit dem Suffix _test).
  6. \n
\n\n

Beispiel für eine korrekte Struktur:

\n\n
myproject/\n├── go.mod          # module myproject\n├── main.go         # package main\n└── helper.go       # package main\n
\n\n

Szenario 4: Dateinamen mit Unterstrichen und Testdateien

\n\n

Go ignoriert Dateien, die mit _ oder . beginnen (z. B. _hidden.go). Dateien mit dem Suffix _test.go werden nur beim Ausführen von Tests (go test) kompiliert. Wenn Sie versehentlich eine Arbeitsdatei helper_test.go genannt haben, sind ihre Funktionen im Hauptcode nicht sichtbar.

\n\n

Szenario 5: Zirkuläre Abhängigkeiten

\n\n

Manchmal kann der Fehler „undefined“ eine Folge von zirkulären Importen sein. Zum Beispiel importiert Paket A Paket B und Paket B importiert Paket A. Go verbietet solche Zyklen und m

Blogs

Buchempfehlungen