1. ホーム
  2. import

[解決済み] 同じフォルダーにあるgoファイルをインポートする

2022-11-19 08:49:43

質問

ローカルのgoファイルを別のgoファイルにインポートするのに苦労しています。

私のプロジェクト構造は以下のようなものです。

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

b.goの中にa.goをインポートしようとしています。私は以下を試しました。

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

どれもうまくいきませんでした。GOPATHをいじらないといけないのはわかるのですが、うまくいきませんでした。現在、私のGOPATHはsamplego(/workspace/samplego)を指していますが、以下のエラーが表示されます。

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

また、これらのソースファイルを別のプロジェクト/モジュールにインポートする場合、GOPATH はどのように機能するのでしょうか?その場合、ローカルインポートは問題になるのでしょうか?この場合、ベストプラクティスは何でしょうか - モジュールに1つのgoファイル(関連するテストを含む)だけを持つことでしょうか?

どのように解決するのですか。

ディレクトリ内のいくつのファイルでも一つのパッケージです。あるファイルで宣言されたシンボルは、他のファイルでは何もしなくても利用できます。 import や修飾子なしで他のファイルから利用できます。すべてのファイルには、同じ package foo 宣言が必要です (さもないと go build ).

必要なのは GOPATH のあるディレクトリに設定します。 pkg , src そして bin ディレクトリが存在します。これは好みの問題ですが、すべてのアプリに単一のワークスペースを用意するのが一般的です(時には $HOME を使用することもあります)、アプリごとに1つではなく、すべてのアプリに対して1つのワークスペースを持つのが一般的です。

通常、Githubのパスは github.com/username/reponame (となります(単に github.com/xxxx ). ですから、もしあなたが main と別のパッケージがある場合、結局は workspace/src のように

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

インポートするときは、常に完全な github.com/... パスでインポートすることに注意してください: 相対インポートはワークスペースでは許可されません。相対インポートはワークスペースでは許可されません。 goimports . もし、あなたが go run で済ませていたのなら、そろそろ go build : run は複数のファイルを扱うことができません。 main をうまく処理できず、わざわざテストしなかったのですが、(Dave Cheneyから ここで ) go run はダーティな依存関係を再構築しません。

少なくとも GOPATH を正しく設定しようとしたようですね。もしまだ行き詰っているなら、環境変数をどのように設定したか(コマンドなど)、どんなコマンドを実行してどんなエラーが起きたかを正確に書いてみてはいかがでしょう。 Linux/UNIX での設定方法 (および設定を永続化する方法) は以下のとおりです。 ワークスペースの設定に関する Go チームからのアドバイスです。 . どちらも役に立たないかもしれませんが、見てみて、もし混乱しているのなら少なくともどの部分が混乱しているのかを指摘してください。