同じフォルダにgoファイルをインポートする


84

ローカルの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つだけ(関連するテストとともに)持つことですか?


ディレクトリ内の任意の数のファイルは、最初から同じパッケージの一部です。(そして、彼らpackage aは上部に同じ宣言を持っている必要があります。)
twotwotwo 2014年

ありがとう@twotwotwo ...上記の問題を解決する方法を教えていただけますか?また、パッケージに複数のgoファイルがある場合、インポートはフルパスに従う必要があります。github.com/xxxx/aまたは単に行う
g0c00l.g33k 2014年

Goモジュールの場合、同じディレクトリ内のファイルは引き続き同じパッケージの一部であり、同じパッケージ名(たとえば、package foo)を持つ必要があり、相互に直接インポートする必要はありません。この回答は、Goモジュールの下の同じモジュールにパッケージをインポートする方法を含め、Goモジュールについてもう少し詳しく説明しています。
typical182

回答:


76

ディレクトリ内の任意の数のファイルが単一のパッケージです。1つのファイルで宣言されたシンボルは、importsや修飾子なしで他のファイルで使用できます。すべてのファイルpackage fooの上部に同じ宣言が必要です(または、からエラーが発生しますgo build)。

あなたは必要なのですかGOPATH、あなたのディレクトリに設定しpkgsrcし、binディレクトリが存在します。これは好みの問題ですが、アプリ$HOMEごとに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 buildrun複数ファイルmainの処理が不十分で、テストする必要はありませんでしたが、(ここのDave Cheneyからgo runダーティな依存関係を再構築しないと聞きました。

少なくともGOPATHを正しい設定にしようとしたようです。それでも問題が解決しない場合は、環境変数の設定方法(コマンドなど)、実行したコマンド、発生したエラーを正確に含めてください。ここでのLinux / UNIXの下でそれを設定(および設定の永続を作る)方法の説明がありますし、ここでは、ワークスペースの設定に行くチームのアドバイスです。どちらも役に立たないかもしれませんが、よく見て、混乱している場合は少なくともどの部分が混乱しているのかを指摘してください。


1
goimportsは非常に役に立ちました:)
g0c00l.g33k 2014年

メインパッケージで複数のファイルを実行する際に問題が発生した場合は、この回答を参照してください。
リックスミス

package main同じディレクトリ内のすべてのファイルに同じ宣言を追加しましたが、undefinedエラーが発生し、同じディレクトリ内のmain.goファイルから関数を表示できませんcontrollers.go
ame 2018年

2
@AlexChaliyを使用している場合はgo run、両方のファイル名を明示的に渡すか、GOPATHのパッケージに入れて実行するように切り替える必要がありますgo build。また、パッケージ構造に関係のない一般的なエラー(名前の入力ミスなど)を再確認してください。それでも解決しない場合は、できる限り詳細に新しい質問を開きます。それは正確にどのように多くの議論がかかる場合がありますあなたの解決するには、dir、ファイルなどを見て、そしてそれが特異的セットアップについてだろう新しい質問は、そのための最善の会場のように思えるからです。
twotwotwo 2018年

40

いいえインポートは限り、あなたは両方の宣言として必要ありませんa.goし、b.go同じパッケージにあるように。次に、を使用go runして複数のファイルを認識できます。

$ go run a.go b.go

14

./main.go(パッケージmain内)
./ a / a.go(パッケージa内)
./ a / b.go(パッケージa内)

この場合:
main.go import "./a"

最初の文字が大文字であるa.goおよびb.goの関数を呼び出すことができます。


0

user2889485の返信のように、いくつかのファイルをメインフォルダーから移動するための本当に基本的なものが欲しかったのですが、彼の具体的な回答はうまくいきませんでした。それらが同じパッケージに入っているかどうかは気にしませんでした。

私のGOPATHワークスペースはc:\work\go、その下にあります

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

main.goI import "/pg/dbtypes"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.