ホームページ  >  記事  >  バックエンド開発  >  golang がパッケージをインポートできない場合はどうすればよいですか?

golang がパッケージをインポートできない場合はどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-06-24 13:09:595573ブラウズ

golang がパッケージをインポートできない場合はどうすればよいですか?

golang がパッケージをインポートできない問題の解決策:

パッケージのインポート:

Standardパッケージの使用は、「fmt」、「net/http」などの指定された短いパスです。

独自のパッケージの場合は、作業ディレクトリ (GOPATH) の下のディレクトリを指定する必要があります。インポート パッケージは実際に基づいています。フォルダー ディレクトリ

パッケージをインポートする複数の方法:

  • $GOPATH/src## から直接インポート# ディレクトリimport "test/lib"(実際のパスは $GOPATH/src/test/lib です)

  • Alias import :

    import alias_name "test/lib" 、この方法で使用する場合、エイリアス

  • ドットを使用してインポートできます:

    import。 "test/lib", function これを使用する場合は、単にパッケージ名

を省略し、アンダースコアを使用してインポートします: import _ "test/lib". この操作は、実際には単に導入するだけですその包み。パッケージがインポートされると、そのすべての init() 関数が実行されますが、実際にはこれらのパッケージを使用する必要がなく、その init() 関数だけを実行したい場合もあります。このとき、_ 操作を使用してパッケージを参照できます。 _ 操作を使用してパッケージを参照する場合でも、パッケージ名を使用してパッケージ内のエクスポートされた関数を呼び出すことはできません。単にその init 関数 () を呼び出すだけです。

多くの場合、これらの init 関数は、外部のユーザーが簡単に使用できるように、独自のパッケージにエンジンを登録します。たとえば、database/sql を実装するパッケージはすべて

sql.Register(name) を呼び出します。 init 関数.string, driver driver.Driver)自分で登録すると、外部から使用できるようになります。

相対パスインポート

import "./model"//モデルディレクトリは現在のファイルと同じディレクトリにありますが、このインポート方法は推奨されません

パッケージのインポート プロセスの説明:

プログラムの初期化と実行は、メイン パッケージから開始されます。メイン パッケージが他のパッケージもインポートする場合、それらはコンパイル中に順番にインポートされます。場合によっては、パッケージが複数のパッケージによって同時にインポートされるため、インポートされるのは 1 回だけになります (たとえば、多くのパッケージで fmt パッケージが使用される可能性がありますが、複数回インポートする必要がないため、インポートされるのは 1 回だけになります)回)。

パッケージをインポートするときに、そのパッケージが他のパッケージもインポートする場合は、他のパッケージが最初にインポートされ、次にこれらのパッケージ内のパッケージレベルの定数と変数が初期化されてから、init が実行されます。 . 関数 (存在する場合) など。インポートされたパッケージがすべてロードされた後、メイン パッケージ内のパッケージ レベルの定数と変数が初期化され、次にメイン パッケージ内の init 関数が実行され (存在する場合)、最後に main 関数が実行されます。次の図は、実行プロセス全体を詳細に説明しています。

golang がパッケージをインポートできない場合はどうすればよいですか?

注:

Go パッケージをインポートするには、用途に応じていくつかの方法があります。コードは作業ディレクトリに均一に保存されます。作業ディレクトリには多数のパッケージが存在します。さまざまなパッケージはディレクトリごとに編成され、パッケージは複数のコード ファイルで構成されます。パッケージをインポートするときは、パッケージの一意のパスに従ってインポートします。インポートされたパッケージはデフォルトで使用する必要があります。使用しない場合、コンパイルは失敗するため、不要なコードの導入を減らすために削除する必要があります。もちろん、 、他の使用シナリオもあります。デフォルトでは、わかりやすいようにファイル名をパッケージ名として使用します。理解を容易にするために、さまざまなパッケージでさまざまな機能の実装が整理されています。

コンパイル時にパッケージのソース コードまたは .a を使用しましたか?

メイン以外のパッケージは、コンパイル後に

.a ファイルを生成します ($GOROOT または # を使用してインストールされない限り、一時ディレクトリに生成されます) go install ##$GOPATH, そうしないと表示されません。 a) 後続の実行可能プログラムのリンクに使用されます。たとえば、Go 標準ライブラリのパッケージに対応するソース コード パスは $GOROOT/src で、標準ライブラリのパッケージのコンパイルされた .a ファイルへのパスは $ です。 GOROOT/pkg/darwin_amd64 ダウン。奇妙な疑問が頭に浮かびました。コンパイル時に、コンパイラーは .a またはソース コードを使用しますか?

    サードパーティ パッケージを使用する場合、ソース コードと .a の両方がインストールされていると、コンパイラはソース コードにリンクします。いわゆるサードパーティ パッケージのソース コードの使用は、実際には、最新のソース コードでコンパイルされた一時ディレクトリ内の
  • .a

    ファイルへのリンクです。

  • Go の標準ライブラリのパッケージもこんな感じなのでしょうか? fmt などの標準ライブラリの場合、コンパイル時に $GOROOT/src 下のソース コードを使用するか、$GOROOT/pkg 下のコンパイル済み .a を使用する必要がありますか?ただし、カスタム パッケージとは異なり、(GO インストール パッケージを再コンパイルせずに) fmt パッケージのソース コードを変更した場合でも、ユーザー ソース コードがコンパイルされるときに、fmt パッケージの再コンパイルは試行されません。 fmt.a
Go 言語では、インポート後のパスの最後の要素はパッケージ名ですか、それともパス名ですか?

    #インポート後の最後の要素は、パッケージ名ではなく、ディレクトリであるパスである必要があります。ただし、多くの場合、パス名はパッケージ名と同じです
  • import m "lib/math" m は、lib/math パス内の唯一のパッケージを指します。コンパイラがこのパス内に 2 つのパッケージを見つけた場合、それは許可されません。コンパイル エラーのレポート

推奨チュートリアル: 「go 言語チュートリアル

以上がgolang がパッケージをインポートできない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。