golang パッケージのインポートプロセスはどのように機能しますか?同じモジュール内でパッケージを複数回初期化する方法はありますか?

PHPz
リリース: 2024-02-06 08:54:08
転載
941 人が閲覧しました

golang 包导入流程如何工作?是否有一种方法可以在同一模块中多次初始化一个包?

質問の内容

私は golang が初めてで、現在パッケージとそのインポートの仕組みについて調べています。この輸入に関していくつか質問があります。私はこの投稿を読んでいます(この投稿には 7,000 件以上の「いいね!」が付いているので、正確だと思います。golang パッケージ と入力すると、Google が最初に表示します)。

私が理解できないことを説明するために、まずプロジェクトの構造がどのようなもので、すべてのファイルの内容がどのようなものであるかを書きます。

リーリー

ご覧のとおり、3 つのパッケージ (メイン パッケージを含めて 4 つのパッケージ) を持つモジュールがあります。すべてのパッケージの内容は以下のとおりです。

pkg1.go コンテンツ:

リーリー

pkg2.go コンテンツ:

リーリー

mypkgの内容:

リーリー

main.go コンテンツ:

リーリー

したがって、main.go には pkg1pkg2 が含まれ、pkg1pkg2 には両方とも # が含まれます##mypkg。私が引用した記事には次のように書かれています (太字): リーリー

これを念頭に置くと、プログラムの出力は次のようになると予想されます。

リーリー

次の手順に従うことを期待しています:

    メインパッケージに入る(1)
  • pkg1 パッケージが初期化されました (2)
    • mypkg パッケージが初期化されました (2.1)
      • mypkg 内のすべてのグローバル変数が初期化されます -
      • prom 私の場合 (2.1.1)
      • mypkg (2.1.2) の init 関数を呼び出します
    • pkg1 (2.2)のinit関数を呼び出します
  • pkg2 パッケージが初期化されました (3)
    • mypkg パッケージが初期化されました (3.1)
      • mypkg 内のすべてのグローバル変数が初期化されます -
      • prom 私の場合 (3.1.1)
      • mypkg (3.1.2) の init 関数を呼び出します
    • pkg2 (3.2)のinit関数を呼び出します
  • メインパッケージの初期化 (4)
  • main の init 関数を呼び出す (5)
  • メインパッケージのメイン関数は (6)
  • と呼ばれます。
代わりに、次の出力が得られます:

リーリー

mypkg

は最初のインポート中に 1 回だけ初期化されるようです。 !さらに、グローバル変数 prom は、pkg1 と pkg2 で同じアドレスを持ちます (この場合は 0x8fe360)。

それでは私の質問は次のとおりです:

    記事の著者は間違いを犯しましたか?インポートされたパッケージは
  1. パッケージごとに 1 回だけ初期化されるのではなく、モジュールごとに 1 回ずつ初期化されます?
  2. これは、パッケージがどこから何回インクルードされたかに関係なく、パッケージ内のグローバル変数はモジュール全体で常に同じ (同じアドレス) であることを意味しますか?つまり、最初のインポート時に
  3. 1 回のみ初期化されるということですか? 「フロー」を機能させる方法はありますか?インポートごとにパッケージが個別に初期化されるということですか?この例では、
  4. mypkg
  5. pkg1 で 1 回初期化され、pkg2 でもう 1 回初期化されることを意味します。 私が読んだ内容が間違っている場合、Go のパッケージとモジュールに関する良い記事を持っている人はいますか?
  6. 一部の人にとって、これらの質問は golang の基本的な知識に関するものであることは承知していますが、初心者である私にとっては、いくつかの誤解を引き起こしました。さらに、プログラムの作業結果は、Google 検索で最初に表示された記事の著者が書いたものと一致しませんでした。お手伝いは大歓迎です。成功を祈ります!

正解

プログラムに含まれるパッケージはセットであり、
main

から始まるすべてのインポートされたパッケージの推移閉包です。今すぐ:### これはセットです。インポートされた各パッケージは 1 回だけ含まれます。これは、パッケージ内で変数を定義すると、その変数は 1 回だけ表示されることを意味します。

    インポートされたすべてのパッケージと再帰的にインポートされるパッケージは、最終的なバイナリに含まれます。
  • 初期化に関しては、手順は正しいです。
  • mypkg
は 1 回だけ初期化します。バイナリ内に

mypkg のコピーが複数ありません。

以上がgolang パッケージのインポートプロセスはどのように機能しますか?同じモジュール内でパッケージを複数回初期化する方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!