# Packages
astパッケージはGoのパッケージの構文木を表すために使用される型を宣言します。.
buildパッケージはGoのパッケージに関する情報を収集します。
# Go Path
Goパスは、Goのソースコードが含まれているディレクトリツリーのリストです。 これは、標準のGoツリーで見つからないインポートを解決するために参照されます。 デフォルトのパスは、GOPATH環境変数の値であり、オペレーティングシステムに適したパスリストとして解釈されます (Unixでは変数はコロンで区切られた文字列であり、 Windowsではセミコロンで区切られた文字列、 Plan 9ではリストです)。
Goパスにリストされている各ディレクトリには、指定された構造が必要です:
src/ディレクトリにはソースコードが格納されます。'src'以下のパスがインポートパスまたは実行可能ファイル名を決定します。
pkg/ディレクトリにはインストールされたパッケージオブジェクトが格納されます。 Goツリーと同様に、各ターゲットオペレーティングシステムと アーキテクチャのペアに対して、pkgのサブディレクトリがあります (pkg/GOOS_GOARCH)。
DIRがGoパスにリストされているディレクトリである場合、DIR/src/foo/barにソースがあるパッケージは「foo/bar」としてインポートされ、 「DIR/pkg/GOOS_GOARCH/foo/bar.a」(またはgccgoの場合は「DIR/pkg/gccgo/foo/libbar.a」)にコンパイルされた形式でインストールされます。
bin/ディレクトリにはコンパイルされたコマンドが格納されます。 各コマンドは、ソースディレクトリを使用して命名されますが、 パス全体ではなく最終要素のみを使用します。つまり、 DIR/src/foo/quuxのソースであるコマンドはDIR/bin/quuxにインストールされます。DIR/bin/foo/quuxではなく、foo/が取り除かれます。 そのため、PATHにDIR/binを追加することで、インストールされたコマンドにアクセスできます。
以下にディレクトリレイアウトの例を示します:
GOPATH=/home/user/gocode
/home/user/gocode/
src/ foo/ bar/ (パッケージ bar の Goコード) x.go quux/ (メインパッケージの Goコード) y.go bin/ quux (インストールされたコマンド) pkg/ linux_amd64/ foo/ bar.a (インストールされたパッケージオブジェクト)
# ビルド制約
ビルド制約、またはビルドタグとも呼ばれるものは、 パッケージに含めるべきファイルの条件です。ビルド制約は、次の行コメントによって与えられます。
//go:build
ビルド制約は、ファイル名の一部にもなることがあります (例えば、source_windows.go は、対象の オペレーティングシステムがwindowsの場合のみ含まれます)。
詳細は 'go help buildconstraint' (https://golang.org/cmd/go/#hdr-Build_constraints) を参照してください。
# バイナリのみのパッケージ
Go 1.12 およびそれ以前では、 パッケージをソースコードなしでバイナリ形式で配布することが可能でした。 パッケージには、ビルド制約で除外されないソースファイルと 「//go:binary-only-package」というコメントが含まれていました。ビルド制約と同様に、このコメントはファイルの先頭に配置され、空行と他の行コメントだけが前にあること、コメントの後には空行があることで、パッケージのドキュメンテーションと区別されます。 ビルド制約とは異なり、このコメントは非テストのGoソースファイルでのみ認識されます。
バイナリのみのパッケージの最小のソースコードは以下のようになります:
//go:binary-only-package
package mypkg
ソースコードには追加のGoコードが含まれる可能性があります。このコードはコンパイルされないが、godocなどのツールによって処理され、エンドユーザのドキュメンテーションとして役立つかもしれません。
"go build" およびその他のコマンドはバイナリオンリーパッケージをサポートしていません。 [Import] と [ImportDir] は、これらのコメントを含むパッケージのBinaryOnlyフラグを設定し、ツールやエラーメッセージで利用することができます。.
constant パッケージは、Go の未型指定の定数とその対応する操作を表現する値を実装します。
エラーにより値が不明な場合、特別な Unknown 値を使用できます。 不明な値に対する操作は、明示的に指定されない限り、不明な値を生成します。.
docパッケージはGo ASTからソースコードのドキュメンテーションを取得します。.
formatパッケージはGoソースコードの標準的なフォーマットを実装します。
Goソースコードのフォーマットは時間とともに変化するため、 一貫したフォーマットに依存するツールは、このパッケージを使う代わりに特定のバージョンのgofmtバイナリを実行する必要があります。 その方法で、フォーマットが安定し、ツールをgoftmtの変更ごとに再コンパイルする必要がなくなります。
たとえば、このパッケージを直接使用するプレサブミットチェックは、 開発者が使用しているGoのバージョンによって異なる動作をするため、不安定になる可能性があります。.
importerパッケージは、エクスポートデータのインポートを提供します。.
parserパッケージはGoのソースファイルのパーサを実装しています。入力はさまざまな形式で提供できます(Parse*関数を参照)。出力はGoソースを表す抽象構文木(AST)です。パーサはParse*関数のいずれかを経由して呼び出されます。 パーサは、Goの仕様で構文的に許可されていないより大きな言語を受け入れていますが、これは単純さと構文エラーの存在下での強靱性の向上のためです。たとえば、メソッド宣言では、レシーバは通常のパラメータリストのように扱われるため、複数のエントリが可能ですが、仕様では一つしか許可されていません。そのため、ASTの対応するフィールド(ast.FuncDecl.Recv)は一つに制限されていません。.
printerパッケージは、ASTノードの印刷を実装しています。.
scannerパッケージはGo言語のソーステキストのためのスキャナを実装します。 ソースとして[]byteを受け取り、Scanメソッドへの繰り返し呼び出しを通じてトークン化します。.
tokenパッケージは、Goプログラミング言語の字句トークンとトークンに対する基本的な操作(印刷、述語)を定義する定数を表します。.
typesパッケージは、Goパッケージの型チェックのためのアルゴリズムを実装し、 データ型を宣言します。[Config.Check] を使用してパッケージの型チェッカーを呼び出すか、 代わりに [NewChecker] で新しい型チェッカーを作成し、[Checker.Files] を呼び出して インクリメンタルに呼び出すことができます。
型チェックは、いくつかの相互依存するフェーズで構成されています。
名前解決は、プログラム内の各識別子([ast.Ident])を、それが示すシンボル([Object])にマッピングします。 識別子のシンボルを見つけるには、[Info] のDefsフィールドとUsesフィールド、または [Info.ObjectOf] メソッドを使用します。 そして、特定の他の種類の構文ノードのシンボルを見つけるには、[Info] のImplicitsフィールドを使用します。
定数畳み込みは、コンパイル時定数であるすべての式([ast.Expr])の正確な定数値 ([constant.Value])を計算します。式の定数畳み込みの結果を見つけるには、[Info] のTypesフィールドを使用します。
型推論は、すべての式([ast.Expr])の型([Type])を計算し、言語仕様に準拠しているかをチェックします。 型推論の結果については、[Info]のTypesフィールドを使用してください。
チュートリアルについては、https://go.dev/s/types-tutorial を参照してください。.
versionパッケージは、[Goツールチェーン名の構文] のような文字列、 つまり "go1.20"、"go1.21.0"、"go1.22rc2"、"go1.23.4-bigcorp"などの [Goバージョン] に対する操作を提供します。
[Goバージョン]: https://go.dev/doc/toolchain#version [Goツールチェーン名の構文]: https://go.dev/doc/toolchain#name.