ローカルgoファイルを別のgoファイルにインポートするのが困難です。
私のプロジェクト構造は以下のようなものです
-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
A.goをb.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はどのように機能しますか?ローカルインポートは問題になりますか?この場合のベストプラクティスは何ですか?モジュール内にgoファイルを1つだけ(テストを関連付けて)持っているのですか?
ディレクトリ内の任意の数のファイルは単一のパッケージです。 1つのファイルで宣言されたシンボルは、import
sまたは修飾子なしで他のファイルで使用できます。すべてのファイルには、上部で同じpackage foo
宣言が必要です(または、go build
からエラーが発生します)。
GOPATH
、pkg
、およびsrc
ディレクトリが存在するディレクトリにbin
を設定する必要があります。これは単に好みの問題ですが、アプリごとに1つではなく、すべてのアプリ(場合によっては$HOME
)に単一のワークスペースを使用するのが一般的です。
通常、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
sをうまく処理できず、テストすることはありませんでしたが、聞いた(Dave Cheneyから here )go run
は、ダーティな依存関係を再構築しません。
少なくともGOPATHを正しいものに設定しようとしたように聞こえるので、まだ行き詰まっている場合は、環境変数(コマンドなど)の設定方法と実行したコマンドと発生したエラーを正確に含めることができます。 Linux/UNIX での設定方法(および設定を永続化する方法)および は、Goチームのアドバイスです。ワークスペースのセットアップ 。どちらも役に立たないかもしれませんが、見て、少なくともあなたが混乱している場合はどの部分があなたを混乱させるかを見てください。
a.go
とb.go
の両方を同じパッケージ内に宣言する限り、インポートは必要ありません。次に、go run
を使用して、複数のファイルを次のように認識できます。
$ go run a.go b.go
./main.go(パッケージmain)
./ a/a.go(パッケージa)
./ a/b.go(パッケージa)
この場合:
main.go import "./a"
A.goおよびb.goの関数を呼び出すことができます。最初の文字の大文字をオンにします。
User2889485の返信のように、メインフォルダーからいくつかのファイルを移動するための本当に基本的なものが欲しかったのですが、彼の具体的な答えはうまくいきませんでした。それらが同じパッケージにあるかどうかは気にしませんでした。
GOPATHワークスペースはc:\work\go
であり、その下には
/src/pg/main.go (package main)
/src/pg/dbtypes.go (pakage dbtypes)
main.go
I import "/pg/dbtypes"