golang „undefined” funkcja zadeklarowana w innym pliku?

146

Próbuję napisać podstawowy program go, który wywołuje funkcję w innym pliku, ale stanowi część tego samego pakietu. Jednak zwraca:

undefined: NewEmployee

Oto kod źródłowy:

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!"
}
Juan M
źródło
czy twoje pliki mają instrukcje dotyczące pakietów? To, co wpisałeś, nie ma pliku package x, również twój główny pakiet zazwyczaj zawiera tylko jeden plik, a następnie importuje inne potrzebne elementy
Chris Pfohl Stycznia
8
używasz go run? (i patrz golang.org/doc/code.html )
JimB
1
@JuanM, moje pytanie brzmi, czy to pełne źródło main.goi employee.go? Ponieważ wszystkie pliki go powinny mieć instrukcję dotyczącą pakietu, a ja nie widzę żadnych w twoim. Zobacz: golang.org/doc/code.html#PackageNames
Chris Pfohl
1
Ostatnia funkcja pliku worker.go jest nieprawidłowa (brak nazwy funkcji, nie zadeklarowano typu zwrotu). Nie jest to problem, o który prosisz, ale pokazuje, że jest więcej problemów. Czy możesz wysłać cały kod i pełny błąd podczas kompilacji?
siritinga
1
następnie pokaż nam, co robisz! GOPATH, rzeczywisty kod i sposób wywoływania gonarzędzia.
JimB

Odpowiedzi:

185

Przeczytaj „Jak napisać kod Go” .

Nie używaj /srcw swoim GOPATH. Pakiety znajdują się w $GOPATH/src.

W przypadku buildlub installmusisz mieć swoje pliki w katalogu pakietu.

Ponieważ go runmusisz podać wszystkie pliki jako argument:

go run main.go employee.go

Ale prawie zawsze powinieneś używać go installlub go build(a najlepiej pierwszego, ponieważ go buildpowoduje zamieszanie podczas pracy z pakietami innymi niż główne)

JimB
źródło
dzięki za wkład @JimB! Edytowałem zmienne środowiskowe (zapomniałem też ustawić GOBIN), przeniosłem pliki do właściwej lokalizacji, ale mimo to, gdy próbuję zainstalować instalację, pojawia się ten sam błąd. Jakieś sugestie?
Juan M
Czy na pewno nie ma innych błędów? Twój plik Employer.go nie może zostać skompilowany w obecnej postaci. W przeciwnym razie muszę dokładnie zobaczyć , co robisz. Dokładne ścieżki, wywołanie itp.
JimB
9
Lub zrób $ go run * .go
Puran
uruchamianie $ go run *.gobyłoby skrótem zamiast uruchamiania wszystkich plików
offerni
69

Właśnie miałem ten sam problem w GoLand (czyli Intellij IDEA for Go) i opracowałem rozwiązanie. Musisz zmienić Run kindz Filena Packagelub Directory. Możesz to wybrać z menu rozwijanego, jeśli przejdziesz do Run/EditKonfiguracji.

Np .: w przypadku opakowania ~/go/src/a_packageużyj a Package pathof a_packagei a Directoryof ~/go/src/a_packageand Run kindof Packagelub Directory.

Andrew W. Phillips
źródło
5
Dziękuję, właśnie tego szukałem. Proszę wspomnieć, że twoja odpowiedź dotyczy Intellij IDEA.
kivagant
16

Jeśli używasz go run, zrób go run *.go. Automatycznie znajdzie wszystkie pliki go w bieżącym katalogu roboczym, skompiluje, a następnie uruchomi twoją główną funkcję.

Paul Razvan Berg
źródło
Czy są jakieś minusy zrobienia tego w ten sposób? Wydaje się, że jest to najprostsza odpowiedź na pytanie dotyczące PO.
Stavros_S
Bardziej ogólne rozwiązanie w Bash: go run !(*_test).go- Golang: uruchamiaj wszystkie pliki .go w bieżącym katalogu za pomocą wiersza poleceń (pakiet wielu plików)
Brent Bradburn
10

Możesz spróbować jednego z poniższych:

Metoda 1 :

  • Załóżmy, że nazwa twojego projektu to MyProject
  • Idź na swoją ścieżkę, biegnij go build
  • Utworzy plik wykonywalny jako nazwę projektu („MyProject”)
  • Następnie uruchom plik wykonywalny za pomocą ./MyProject

Możesz wykonać oba kroki jednocześnie, wpisując go build && ./MyProject. Pliki Go package mainsą kompilowane do pliku wykonywalnego.

Metoda 2 :

  • Po prostu biegnij go run *.go. Nie utworzy żadnego pliku wykonywalnego, ale działa.
Chanaka Caldera
źródło
6

Jeśli chcesz wywołać funkcję z innego pliku go i używasz Golanda, znajdź opcję „Edytuj konfigurację” z menu Uruchom i zmień rodzaj uruchomienia z Plik na Katalog. Czyści wszystkie błędy i umożliwia wywoływanie funkcji z innych plików go.

Puneet Tokhi
źródło
1

Napotkałem ten sam problem Go11, po prostu chciałem podzielić się, jak go rozwiązałem, pomagając innym na wypadek, gdyby napotkali ten sam problem.

Miałem swój projekt Go na zewnątrz $GOPATH , więc musiałem włączyć GO111MODULE=onbez włączonej tej opcji, da ci ten problem; nawet jeśli spróbujesz zbudować lub przetestować całość, packageinaczej directorynie zostanie to rozwiązane bezGO111MODULE=on

Muhammad Soliman
źródło
1

go run .uruchomi wszystkie twoje pliki. Punkt wejścia to funkcja, main()która musi być unikalna dla mainpakietu.

Inną opcją jest zbudowanie pliku binarnego za pomocą go buildi uruchomienie go.

Miguel Reyes
źródło
Uruchomiłem stary projekt go i zapomniałem, jak to zrobić. W końcu znalazłem to dzięki twojej odpowiedzi. To powinna być pozytywna odpowiedź!
moondaddi
1

powinieneś użyć modułów go teraz, jeśli nie śledzisz Jak napisać kod go

Z modułem go nie musisz umieszczać kodu w $ GOPATH / src. może również mieszkać w dowolnym innym miejscu.

Możesz przenieść kod do innego katalogu, np. / Worker. Aby to działało. Po prostu pod katalogiem pracowników uruchom moduł go

go mod init example.com/employee
Jeetsang
źródło
0

Po prostu użyj polecenia, go run *.goaby wykonać wszystkie pliki go w pakiecie!

d0zingcat
źródło
Odpowiedź brzmi jak odpowiedź @Paul Razvan Berg
Chris Catignani
-1

Jeśli twój folder źródłowy ma strukturę / go / src / blog (zakładając, że nazwa twojego folderu źródłowego to blog).

  1. cd / go / src / blog ... (cd wewnątrz folderu, w którym znajduje się twój pakiet)
  2. przejdź do instalacji
  3. blog

Powinno to uruchamiać wszystkie pliki w tym samym czasie, zamiast konieczności ręcznego wyświetlania listy plików lub „biczowania” metody w wierszu poleceń.

Druhin Bala
źródło
A oto cyfrowy ocean zbyt artykuł: digitalocean.com/community/tutorials/...
Druhin Bala