web-dev-qa-db-fra.com

importer des fichiers go dans le même dossier

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)?

58
g0c00l.g33k

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.

53
twotwotwo

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
24
Jason Kao

./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.

9
user2889485

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"

0
Dave Pile