受け入れられた答えは、ディレクトリをパッケージ名と照合する必要があることについては依然として正しいですが、GOPATHを使用する代わりにGoモジュールを使用するように移行する必要があります。この問題に遭遇した新しいユーザーは、GOPATHの使用について(私がそうであったように)言及していることに混乱しているかもしれません。そこで、この問題を解決し、Goモジュールを使用する場合のこの問題の防止に関連するガイダンスを提供するように努めます。
Goモジュールに既に精通していて、この問題が発生している場合は、見落としたり忘れたりしやすいGoの規則のいくつかをカバーする、以下のより具体的なセクションにスキップしてください。
このガイドでは、Goモジュールについて説明しています:https : //golang.org/doc/code.html
Goモジュールを使用したプロジェクト編成
Goモジュールに移行したら、その記事で説明したように、説明に従ってプロジェクトコードを編成します。
リポジトリには1つ以上のモジュールが含まれています。モジュールは、一緒にリリースされる関連するGoパッケージのコレクションです。Goリポジトリには通常、リポジトリのルートにある1つのモジュールのみが含まれています。そこでgo.modという名前のファイルでモジュールパスを宣言します。これは、モジュール内のすべてのパッケージのインポートパスプレフィックスです。モジュールには、go.modファイルを含むディレクトリ内のパッケージと、そのディレクトリのサブディレクトリが含まれ、次のサブディレクトリまで、別のgo.modファイル(存在する場合)が含まれます。
各モジュールのパスは、パッケージのインポートパスプレフィックスとして機能するだけでなく、ダウンロードするためにgoコマンドがどこを探すべきかを示します。たとえば、モジュールgolang.org/x/toolsをダウンロードするために、goコマンドはhttps://golang.org/x/toolsで示されるリポジトリを参照します(詳細はこちら)。
インポートパスは、パッケージのインポートに使用される文字列です。パッケージのインポートパスは、モジュール内のサブディレクトリと結合されたモジュールパスです。たとえば、モジュールgithub.com/google/go-cmpには、ディレクトリcmp /にパッケージが含まれています。そのパッケージのインポートパスはgithub.com/google/go-cmp/cmpです。標準ライブラリのパッケージには、モジュールパスのプレフィックスがありません。
次のようにモジュールを初期化できます:
$ go mod init github.com/mitchell/foo-app
ビルドするためにコードをgithub.comに置く必要はありません。ただし、最終的には公開されるようにモジュールを構成することがベストプラクティスです。
パッケージを取得しようとするとどうなるかを理解する
パッケージまたはモジュールを取得しようとするとどうなるかを説明したすばらしい記事があります。https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16
パッケージの保存場所とGoモジュールを既に使用している場合に、このエラーが発生する理由を理解するのに役立ちます。
インポートされた関数がエクスポートされたことを確認します
別のファイルから関数にアクセスできない場合は、関数をエクスポートしたことを確認する必要があります。私が提供した最初のリンクで説明したように、関数は大文字で始まり、エクスポートして他のパッケージにインポートできるようにする必要があります。
ディレクトリの名前
(受け入れられた回答で述べられているように)もう1つの重要な詳細は、ディレクトリの名前がパッケージの名前を定義するものであるということです。(あなたのパッケージ名は、そのディレクトリ名と一致する必要があります。)あなたはここで、この例を見ることができます:https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc
付きmain
つまり、メソッド(つまり、アプリケーションのエントリポイント)を含むファイルは、この要件からある程度除外されています。
例として、次のような構造を使用すると、インポートで問題が発生しました。
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
私は、内のコードをインポートすることができませんでしたutils
私にmain
パッケージ。
ただし、main.go
以下に示すように独自のサブディレクトリに配置すると、インポートは正常に機能しました。
/my-app
├── go.mod
├── /src
├── /app
| └── main.go
└── /utils
└── utils.go
その例では、私のgo.modファイルは次のようになります。
module git.mydomain.com/path/to/repo/my-app
go 1.14
への参照を追加した後でmain.goを保存したときutils.MyFunction()
、私のIDEは次のようにパッケージへの参照を自動的にプルしました。
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
(私はGolang拡張機能付きのVSコードを使用しています。)
インポートパスに、パッケージへのサブディレクトリが含まれていることに注意してください。
プライベートレポの取り扱い
コードがプライベートリポジトリの一部である場合、アクセスを有効にするにはgitコマンドを実行する必要があります。そうしないと、他のエラーが発生する可能性がありますこの記事では、プライベートGithub、BitBucket、およびGitLabリポジトリに対してそれを行う方法について説明します。 repositories-dfe795068db4
この問題については、ここでも説明しています。プライベートリポジトリを「取得」する適切な方法は何ですか。