importowanie plików go do tego samego folderu

86

Mam trudności z zaimportowaniem lokalnego pliku go do innego pliku go.

Struktura mojego projektu jest podobna do poniższej

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

Próbuję zaimportować a.go do b.go. Wypróbowałem następujące,

import "a"
import "github.com/xxxx/a"

Żadne z nich nie zadziałało… Rozumiem, że muszę wtrącać się do GOPATH, ale nie mogłem tego zrobić dobrze. Obecnie mój GOPATH wskazuje na samplego (/ workspace / samplego). Otrzymuję poniższy błąd

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

Jak działa GOPATH, gdy te pliki źródłowe są importowane do innego projektu / modułu? Czy lokalny import byłby wtedy problemem? Jaka jest najlepsza praktyka w tym przypadku - czy jest to tylko jeden plik go w module (z powiązanymi testami)?

g0c00l.g33k
źródło
Dowolna liczba plików w katalogu jest częścią tego samego pakietu od samego początku. (I muszą mieć tę samą package adeklarację u góry.)
twotwotwo
Dzięki @twotwotwo ... Czy możesz dać mi znać, jak rozwiązać powyższy problem? Ponadto, gdy mamy w pakiecie pliki go z wieloma plikami, to import powinien mieć pełną ścieżkę, np. github.com/xxxx/a lub po prostu wystarczy
g0c00l.g33k
W przypadku modułów Go pliki w tym samym katalogu nadal stanowią część tego samego pakietu, nadal muszą mieć tę samą nazwę pakietu (np. package foo) I nadal nie muszą się nawzajem bezpośrednio importować. Ta odpowiedź zawiera nieco więcej informacji na temat modułów Go, w tym sposób importowania pakietów w tym samym module w sekcji Moduły Go.
typowo 182

Odpowiedzi:

79

Dowolna liczba plików w katalogu to pojedynczy pakiet; symbole zadeklarowane w jednym pliku są dostępne dla innych bez żadnych imports lub kwalifikatorów. Wszystkie pliki wymagają tej samej package foodeklaracji u góry (w przeciwnym razie pojawi się błąd go build).

Trzeba GOPATHzestaw do katalogu, w którym twoi pkg, srci binkatalogi zamieszkania. To tylko kwestia preferencji, ale często istnieje jeden obszar roboczy dla wszystkich aplikacji (czasami $HOME), a nie jeden na aplikację.

Normalnie ścieżka Github byłaby github.com/username/reponame(nie tylko github.com/xxxx). Więc jeśli chcesz mieć maini kolejny pakiet, możesz skończyć robiąc coś workspace/srcpodobnego

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

Pamiętaj, że zawsze importujesz pełną github.com/...ścieżkę: import względny nie jest dozwolony w obszarze roboczym. Jeśli znudzi Ci się wpisywanie ścieżek, użyj goimports. Jeśli sobie z go runtym poradziłeś , czas przejść na go build: runsłabo radzi sobie z wieloma plikami maini nie zawracałem sobie głowy testowaniem, ale usłyszałem (od Dave'a Cheneya tutaj ) go runnie odbudowuje brudnych zależności.

Wygląda na to, że przynajmniej próbowałeś ustawić GOPATH we właściwy sposób, więc jeśli nadal utkniesz, może uwzględnij dokładnie sposób ustawienia zmiennej środowiskowej (polecenie itp.) I jakie polecenie uruchomiłeś i jaki błąd się wydarzył. Oto instrukcje, jak to ustawić (i utrwalić ustawienie) w systemie Linux / UNIX, a tutaj są porady zespołu Go dotyczące konfiguracji obszaru roboczego . Może to nie pomaga, ale spójrz i przynajmniej wskaż, która część cię dezorientuje, jeśli jesteś zdezorientowany.

twotwotwo
źródło
1
goimports był całkiem pomocny :)
g0c00l.g33k
Jeśli masz problemy z uruchomieniem wielu plików w pakiecie głównym, zobacz tę odpowiedź .
Rick Smith
Dodałem tę samą package maindeklarację do wszystkich plików w tym samym katalogu, ale mam undefinedbłąd, main.gonie widzę funkcji z pliku, controllers.goktóry jest w tym samym katalogu.
AME
2
@AlexChaliy Jeśli używasz go run, może być konieczne jawne przekazanie do niego obu nazw plików lub przełączenie się na umieszczenie ich w pakiecie w GOPATH i umieszczenie go buildgo. Sprawdź również dwukrotnie, czy nie występują typowe błędy niezwiązane ze strukturą pakietu (takie jak wpisana literówka). Jeśli nic z tego nie rozwiązuje problemu, otworzę nowe pytanie ze wszystkimi możliwymi szczegółami; może to wymagać wielu dyskusji na temat tego, jak dokładnie wygląda twój katalog, pliki itp. do rozwiązania, a ponieważ dotyczy to konkretnie twojej konfiguracji, nowe pytanie wydaje się najlepszym miejscem do tego.
twotwotwo
41

Import nie jest konieczny, o ile zadeklarujesz oba a.goi b.gobędziesz w tym samym pakiecie. Następnie możesz użyć go rundo rozpoznania wielu plików za pomocą:

$ go run a.go b.go
Jason Kao
źródło
14

./main.go (w pakiecie main)
./a/a.go (w pakiecie a)
./a/b.go (w pakiecie a)

w tym przypadku:
main.go import „./a”

Może wywołać funkcję z a.go i b.go, które mają pierwsze litery.

user2889485
źródło
0

Chciałem tylko czegoś naprawdę podstawowego, aby przenieść niektóre pliki z głównego folderu, na przykład odpowiedź użytkownika 2889485, ale jego konkretna odpowiedź nie działała dla mnie. Nie obchodziło mnie, czy są w tym samym opakowaniu, czy nie.

Mój obszar roboczy GOPATH jest c:\work\goi pod tym mam

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

w main.goI import "/pg/dbtypes"

Dave Pile
źródło