ディレクトリとパッケージ名を一致させる必要があることについては、受け入れられた答えはまだ正しいですが、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 Code を使用しています。)
インポート パスにパッケージのサブディレクトリが含まれていることに注意してください。
プライベートレポの扱い
コードがプライベート リポジトリの一部である場合は、git コマンドを実行してアクセスを有効にする必要があります。そうしないと、他のエラーが発生する可能性があります。 repositories-dfe795068db4
この問題は、ここでも議論されています:プライベート リポジトリを「取得」する適切な方法は何ですか?