J'ai des difficultés à importer un fichier go local dans un autre fichier go.
Ma structure de projet est comme ci-dessous
-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
J'essaie d'importer a.go dans b.go. J'ai essayé ce qui suit,
import "a"
import "github.com/xxxx/a"
Rien de tout cela n'a fonctionné .. Je comprends que je dois me mêler de GOPATH mais je ne pouvais pas le faire correctement. Actuellement, mon GOPATH pointe sur samplego (/ workspace/samplego) .J'obtiens l'erreur ci-dessous
cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)
De plus, comment fonctionne GOPATH lorsque ces fichiers source sont importés dans un autre projet/module? Les importations locales seraient-elles un problème alors? Quelle est la meilleure pratique dans ce cas - est-ce d’avoir un seul fichier dans le module (avec les tests associés)?
N'importe quel nombre de fichiers dans un répertoire sont un seul paquet; Les symboles déclarés dans un fichier sont disponibles pour les autres sans aucun import
s ni qualificateur. Tous les fichiers ont besoin du même fichier package foo
déclaration en haut (ou vous obtiendrez une erreur de go build
).
Vous avez besoin que GOPATH
soit défini dans le répertoire où résident vos répertoires pkg
, src
et bin
. C’est juste une question de préférence, mais il est courant d’avoir un seul espace de travail pour toutes vos applications (parfois $HOME
), pas un par application.
Normalement, un chemin de Github serait github.com/username/reponame
(pas seulement github.com/xxxx
). Donc, si vous voulez avoir main
et un autre paquet, vous risquez de faire quelque chose sous workspace/src
comme
github.com/
username/
reponame/
main.go // package main, importing "github.com/username/reponame/b"
b/
b.go // package b
Notez que vous importez toujours avec le github.com/...
chemin: les importations relatives ne sont pas autorisées dans un espace de travail. Si vous êtes fatigué de taper des chemins, utilisez goimports
. Si vous vous débrouilliez avec go run
, il est temps de passer à go build
: run
traite mal les fichiers main
à fichiers multiples et je ne me suis pas donné la peine d'essayer, mais j'ai entendu (de Dave Cheney ici ) go run
ne reconstruit pas les dépendances sales.
On dirait que vous avez au moins essayé de définir GOPATH comme il convient. Par conséquent, si vous êtes toujours bloqué, indiquez peut-être exactement comment vous définissez la variable d'environnement (la commande, etc.) et quelle commande vous avez exécutée et quelle erreur s'est produite. Voici les instructions pour le configurer (et rendre le paramètre persistant) sous Linux/UNIX et voici les conseils de l'équipe Go sur la configuration de l'espace de travail . Peut-être que cela n’aide en rien, mais jetez un coup d’œil et indiquez au moins quelle partie vous dérange si vous êtes confus.
Aucune importation n'est nécessaire tant que vous déclarez les deux a.go
et b.go
être dans le même paquet. Ensuite, vous pouvez utiliser go run
pour reconnaître plusieurs fichiers avec:
$ go run a.go b.go
./main.go (dans le paquet principal)
./ a/a.go (dans le paquet a)
./ a/b.go (dans le paquet a)
dans ce cas:
main.go import "./a"
Il peut appeler la fonction dans a.go et b.go, avec la première lettre en majuscule.
Je voulais juste quelque chose de vraiment basique pour déplacer certains fichiers hors du dossier principal, comme la réponse de user2889485, mais sa réponse spécifique ne fonctionnait pas pour moi. Je ne m'inquiétais pas si elles étaient dans le même paquet ou pas.
Mon espace de travail GOPATH est c:\work\go
et sous que j'ai
/src/pg/main.go (package main)
/src/pg/dbtypes.go (pakage dbtypes)
dans main.go
JE import "/pg/dbtypes"