Golang "undefinierte" Funktion in einer anderen Datei deklariert?


135

Ich versuche, ein einfaches go-Programm zu schreiben, das eine Funktion für eine andere Datei aufruft, aber Teil desselben Pakets ist. Es wird jedoch Folgendes zurückgegeben:

undefined: NewEmployee

Hier ist der Quellcode:

main.go::

package main

func main() {
emp := NewEmployee()    
}

employee.go::

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}

Haben Ihre Dateien Paketanweisungen? Was Sie eingegeben haben, hat keine package x, außerdem enthält Ihr Hauptpaket normalerweise nur eine einzige Datei und importiert dann die anderen benötigten Teile
Chris Pfohl

8
verwenden Sie go run? (und siehe golang.org/doc/code.html )
JimB

1
@ JuanM, meine Frage war, dass die vollständige Quelle von main.gound employee.go? Weil alle go-Dateien eine Paketanweisung haben sollen und ich keine in Ihrer sehe. Siehe: golang.org/doc/code.html#PackageNames
Chris Pfohl

1
Die letzte Funktion von employee.go ist falsch (kein Funktionsname, kein Rückgabetyp deklariert). Es ist nicht das Problem, nach dem Sie fragen, aber es zeigt, dass es mehr Probleme gibt. Könnten Sie den vollständigen Code und den vollständigen Fehler beim Kompilieren veröffentlichen?
Siritinga

1
dann zeig uns was du tust! GOPATH, tatsächlicher Code und wie Sie das goTool aufrufen .
JimB

Antworten:


172

Bitte lesen Sie "Wie schreibe ich Go Code" .

Nicht /srcin Ihrem verwenden GOPATH. Pakete befinden sich in $GOPATH/src.

Für buildoder installSie müssen Ihre Dateien in einem Paketverzeichnis haben.

Für go runmüssen Sie alle Dateien als Argument angeben:

go run main.go employee.go

Sie sollten jedoch fast immer go installoder verwenden go build(und vorzugsweise das erstere, da dies go buildbei der Arbeit mit Nicht-Hauptpaketen zu Verwirrung führt).


danke für die Eingabe @JimB! Ich habe die Umgebungsvariablen bearbeitet (ich hatte auch vergessen, GOBIN festzulegen), meine Dateien an den richtigen Speicherort verschoben, aber immer noch, wenn ich versuche, zu installieren, erhalte ich den gleichen Fehler. Irgendwelche Vorschläge?
Juan M

Sind Sie sicher, dass es keine weiteren Fehler gibt? Ihre employee.go-Datei kann nicht so kompiliert werden, wie sie ist. Ansonsten muss ich genau sehen , was Sie tun. Genaue Pfade, Aufruf usw.
JimB

8
Oder machen Sie $ go run * .go
Puran

run $ go run *.gowäre eine Abkürzung, anstatt alle Dateien
auszuführen

60

Ich hatte gerade das gleiche Problem in GoLand (Intellij IDEA for Go) und habe eine Lösung gefunden. Sie müssen das Run kindvon Filenach Packageoder ändern Directory. Sie können dies aus einer Dropdown-Liste auswählen, wenn Sie in Run/EditKonfigurationen gehen .

Beispiel: ~/go/src/a_packageVerwenden Sie für die Verpackung ein Package pathvon a_packageund ein Directoryvon ~/go/src/a_packageund Run kindvon Packageoder Directory.


1
Danke, das habe ich gesucht. Bitte erwähnen Sie, dass es sich bei Ihrer Antwort um Intellij IDEA handelt.
Kivagant

12

Wenn Sie verwenden go run, tun Sie go run *.go. Es findet automatisch alle go-Dateien im aktuellen Arbeitsverzeichnis, kompiliert und führt dann Ihre Hauptfunktion aus.


Gibt es irgendwelche Nachteile, wenn man es so macht? Dies scheint die einfachste Antwort auf die Frage der OP zu sein.
Stavros_S


8

Sie können eine der folgenden Möglichkeiten ausprobieren.

Methode 01 : Nehmen Sie an, dass Ihr Projektname lautetMyProject

  • Gehen Sie zu Ihrem Pfad, geben Sie ein go buildund drücken Sie die Eingabetaste.
  • Es wird eine ausführbare Datei als Ihr Projektname erstellt ("MyProject").
  • Geben Sie dann in Ihr Terminal ein ./MyProjectund drücken Sie die Eingabetaste

Sie können beide Schritte gleichzeitig ausführen, indem Sie tippen go build && ./MyProject. Es wird Ihr Projekt mit allen ordnungsgemäß ausführengo Dateien .

Methode 02

Geben Sie einfach ein go run *.gound drücken Sie die Eingabetaste. Dies wird alle Ihre ausführengo files .

Hoffe das wird jemandem helfen.


4

Wenn Sie eine Funktion aus einer anderen go-Datei aufrufen möchten und Goland verwenden, suchen Sie im Menü Ausführen die Option 'Konfiguration bearbeiten' und ändern Sie die Ausführungsart von Datei in Verzeichnis. Es löscht alle Fehler und ermöglicht es Ihnen, Funktionen aus anderen go-Dateien aufzurufen.


1

Ich bin auf das gleiche Problem mit gestoßen Go11 gestoßen und wollte nur mitteilen, wie ich es gelöst habe, um anderen zu helfen, nur für den Fall, dass sie auf dasselbe Problem stoßen.

Ich hatte mein Go-Projekt draußen $GOPATH , also musste ich es aktivieren, GO111MODULE=onohne dass diese Option aktiviert war. Es wird Ihnen dieses Problem geben. selbst wenn Sie versuchen, das Ganze zu bauen oder zu testen, packageoder directoryes wird nicht ohne gelöst werdenGO111MODULE=on


1

Sie sollten jetzt go-Module verwenden , wenn Sie nicht folgen wie Go-Code geschrieben wird

Mit dem go-Modul müssen Sie den Code nicht in $ GOPATH / src eingeben. es kann auch an jedem anderen Ort leben.

Sie können den Code in ein anderes Verzeichnis wie / employee verschieben. Damit er funktioniert, initialisieren Sie das go-Modul direkt unter dem Mitarbeiterverzeichnis

go mod init example.com/employee

0

Wenn Ihr Quellordner strukturiert ist / go / src / blog (vorausgesetzt, der Name Ihres Quellordners ist blog).

  1. cd / go / src / blog ... (cd in dem Ordner, in dem sich Ihr Paket befindet)
  2. gehe installieren
  3. Blog

Damit sollten alle Ihre Dateien gleichzeitig ausgeführt werden, anstatt dass Sie die Dateien manuell auflisten oder eine Methode in der Befehlszeile "verprügeln" müssen.


0

go run .führt alle Ihre Dateien aus. Der Einstiegspunkt ist die Funktion, main()die für das mainPaket eindeutig sein muss .

Eine andere Möglichkeit besteht darin, die Binärdatei mit zu erstellen go buildund auszuführen.


0

Verwenden Sie einfach den Befehl go run *.go, um alle go-Dateien in Ihrem Paket auszuführen!


Die Antwort ist wie die Antwort von @Paul Razvan Berg
Chris Catignani
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.