1、基本的な考え方
ゴー言語は整理するために、ソースコードのパッケージを使用して、名前空間を管理することです。任意のソースコードファイルは、パッケージに属している必要があります。コードの有効なソースファイルの最初の行は、パッケージpacakgeName声明文によるところそのパッケージの文でなければなりません。
1)コンセプト
ディレクトリツリーの組織による囲碁言語パック、共通名は、パッケージのファイル名が、Goは必須パッケージ名が同じ名前自分のディレクトリ名でなければなりませんではないが、ソースディレクトリがあるが、それは推奨されているパッケージ名と同じ名前のディレクトリなので、より明確に構造化します。
ディープパケットがディレクトリで定義することができ、それは、ディレクトリパスを含むパケット内の定義が、参照パケットは、参照によって全体的に完全なパスであるれていません。例えば、$ GOPATH / srcに/ A / Bで/パッケージCを定義します。パッケージ内のCソースは、単にパッケージcを宣言したが、パッケージのA / B / Cとしてではなく、「インポート」Cパック、パスのインポート「/ B / C」を取る必要性の中で宣言されていません。
パッケージのイディオム:
- 一般的なパッケージには、小文字の短い名前を使用しています。
- 一般的には、パッケージ化すると、同じ名前のディレクトリがあります。
2)パッケージ参照
$ GOROOT / srcに/下に置か標準ソースパケット、標準パッケージを直接呼び出すことができます。そして、ソースパッケージの定義から、サードパーティ製のパッケージは$ GOPATH / srcディレクトリを参照することができます置く必要があります。
参照パケットの書き込みは、2つの経路があり、一方は他方が相対パスであり、完全なパスです。
パッケージの絶対パスは、「$ GOROOT / srcにまたは$ GOPATH / srcの」パンのソースへのフルパスです。
3)基準パケットフォーマット
標準参照:インポート「FMT」
この時点で、それができる「FMT」プレフィックス基準素子は、一般的に使用される方法であって、パッケージ内に誘導することができます。
別名参照:インポートF「FMT」
「F.」の代わりに標準「FMT」FMTプレフィックス基準要素を置換F FMTエイリアスからパッケージへのこの時間相当、でカプセル化誘導することができます。
省略道:.インポート「FMT」
このとき、パッケージは、現在のプログラムに直接組み込む、要素は接頭辞を用いて導出することができるFMT名前空間の名前空間に相当するFMTパッケージ化することができない「FMT」を、直接参照。
インポート_「FMT」:のみ初期化パケットのinit関数を実行します
標準フォーマットの参照パッケージを使用しますが、パッケージのコードを使用していない、コンパイラが文句を言うでしょう。パッケージがインポート_「のpackageName」このリファレンス・パッケージを介して、初期化関数initが含まれている場合は、パッケージのみ初期化機能を実行しなくても、パッケージの初期化関数initあれば、それはコンパイルエラーにつながることはありません。
注意:
- パケットは、複数の機能がinitを有することができ、パッケージ全体は、それが実行の順序を保証しない、ロードされた初期化機能が実行され、それは複数のパケットにinit関数で推奨されていない、必要な論理機能はINIT内部に配置され初期化します。
- パッケージには、循環参照を表示することはできません。Cやパケットの参照は、コンパイラができないパケットような包装袋参照のB、B参照バッグパッケージC、など。
- 許可されたパケットの重複参照。このようなパッケージとパケットB、C、パッケージ参照として、パケットBおよびCは、パケットリファレンスパッケージDです。このシナリオでは、参照さDに対応を繰り返し、この状況が許可され、および保証は、Dコンパイラが行くのinit関数は一度だけ実行されます。
INIT()関数は、以下の特徴を有します。
- 各ソースは、init()関数を使用することができます。
- (関数はメイン実行の前に())のinit()関数は、プログラムの実行前に自動的に呼び出されます。
- 初期のパッケージ、深さ優先順の基準主シーケンス()を呼び出します。
メイン→A→B→C、次にパケットのinit()関数の呼び出し順序:例えば、そのようなAパッケージ参照関係を前提としています。
C.init→B.init→A.init→メイン
説明:
- 予測不可能なために同じパッケージのinit()関数呼び出しの複数。
- init()関数は他の関数によって呼び出すことはできません。
4)パッケージのロード
囲碁初期化パケットには次の特徴があります。
- 最終的なパッケージ参照有向非巡回グラフを生成するために、パッケージの初期化メイン関数リファレンスパケット開始からのプログラム、あなたが他のパッケージへの参照を見つけなくなるまで、パッケージをパッケージへの参照を見つけるためのステップバイステップ、。
- ゴーコンパイラは木がある非循環グラフに変換して、ツリーを初期化し、リーフパケットノードから層ごとに起動しています。
- シングルパケットの初期化プロセスは、最初の定数とグローバル変数、パッケージのinit関数の最後の実行(もしあれば)を初期化します。
2、カスタムパッケージ
我々のパッケージは、アプリケーションの一部だけであれば、GOPATHのsrcディレクトリ(またはサブディレクトリのsrc GOPATH)を置くために最善のカスタムパッケージを作成し、アプリケーションのサブディレクトリの下に直接配置することができますが、もし私たちは、同じディレクトリに2つの異なるパッケージは、名前の衝突が発生した場合、それは、srcディレクトリのGOPATHつのディレクトリ上の各パッケージの下に配置する必要があり、このパッケージは、他のアプリケーションで共有することができることを願っていますコンパイルエラー。
ソースコードとして条約は、同じ名前のフォルダにパッケージ内に配置する必要があります。同じパッケージには、任意の数のファイル、ファイル名を持つことができると規定はない(が、その後の名前は.GOでなければならない)、我々は、パッケージ名のファイル名を想定しているパッケージは、複数の.GOファイルを持っている場合、(.GOです).GO同じファイル名とパッケージ名が存在することになるところ。
私たちは袋に新しいパッケージを作成する場合は、例えば、次のパッケージmy_package二つの新しいパッケージPKG1とPKG2を作成し、あなたはそうすることができますようにaGoPath / SRC / my_package /としてaGoPath / SRC / my_packageビルド2つのサブディレクトリにPKG1とaGoPath / SRC / my_package / PKG2、パッケージファイルを対応するaGoPath / SRC / my_package / PKG1 /で pkg1.go とaGoPath / SRC / my_package / PKG2 / pkg2.go.
その後、あなたは輸入my_package / PKG2缶を使用して、インポートPKG2にしたい場合。囲碁言語の標準ライブラリのソースツリーには、そのような構造です。もちろん、my_packageディレクトリには、このようなaGoPath / SRC / my_package / my_package.goファイルとして、独自のパッケージを持つことができます。
3、パッケージを作成します
パッケージは、パッケージの所属コードの最初の行と同じディレクトリ内のすべての文書がファイルをマークするために追加されている必要があります。
パッケージのパッケージ名
次の特性をパッケージ化します。
- パッケージの所有権の下のディレクトリ内のファイルをピア。
- パッケージ名は、そのディレクトリ名に異なる場合があります。
- パッケージパッケージは、出力の実行可能ファイルをコンパイルしませんが、ソースコードはメインのパッケージではありませんコンパイル、アプリケーションのメインエントランスパッケージの名前。
各パッケージには、一般的にその内部に各識別子ごとに異なる名前空間の下でアクセスを定義しました。特定のパッケージに関連付けられているそれぞれの名前空間は、の種類、機能を与えてみましょう、とそう避けるため、我々はそれらを使用するときに名前の他の部分での競合を減らすために、短くて明確な名前を選択します。
各パッケージには、リードアウトかどうかを見て、パッケージ名にパッケージの特性を制御することによって達成することができます。パッケージ部材を制限することによって具現化の可視性と非表示APIパッケージ、パッケージには、その実施を調整するユーザーに影響を与えることなく、内部の守備外側クラッドが可能になります。カプセル化された変数の可視性を制限することによって、あなたはまた、アクセスするユーザーを強制し、一貫性と同時実行性の制約相互排他内部変数を確保することができ、特定の内部変数関数を、更新することができます。
図4に示すように、誘導されたパッケージ識別子
あなたはとき(などのタイプ、変数、定数、など)パッケージ識別子別の引用識別子をエクスポートする場合は、囲碁の言語では、あなたが最初の袋の中で参照されている必要があり、大文字の最初の文字は、識別子にエクスポートされますこれらの識別子への参照を訪問することができますすることができます。
その最初の文字が大文字にされている場合の構造又はインターフェース、フィールドまたはメソッドを派生され、外部のフィールドとメソッドにアクセスすることができます。