2013-06-05 6 views
11

This repoには3つのgoファイルがあり、すべて "package wood"で始まります。 は、このパッケージを使用するには、私は私のGOROOTでこれを置くことになってると私のプログラムでは、単に複数のファイルを含むパッケージはどのようにgolangで動作しますか?

import lumber 

。このパッケージの変数と型は、複数のファイルにまたがってどのように接続しますか? goコンパイラは、最初に読み込むファイルをどのように知っていますか?

パッケージを読む場合、パッケージを理解するためにどこから読んで始めますか?ここでは物事の流れは何ですか?

+0

@elithrar:そうではありません。ファイルスコープとパッケージスコープは異なるスコープです。たとえば、インポートにはパッケージスコープしかないので、パッケージのすべてのソースファイルをまとめてまとめることは、一般的な場合には機能しません。 – zzzz

+0

@jnml大丈夫ですので、基本的にはすべてのファイルが1つの大きなファイルに連結されています。 – pymd

+0

@nomad:そうは思わない。インポート修飾子はファイルスコープであり、ファイルを1つに結合することによって再現することはできません。たとえば、識別子 'template'は、パッケージ 'text/template'を1つのファイルで参照できますが、他のファイルでは 'html/template'をパッケージ化することができます。このスコープは、パッケージスコープに "持ち上げる"ことはできません。 – zzzz

答えて

15

いいえ、あなたはではありません "これを私のゴーロットに入れてください"

$ go get github.com/jcelliott/lumber 

にリポジトリをクローンします。次に、スコープ規則について

import "github.com/jcelliott/lumber" 

として、あなたのコードでそれをインポートすることで、パッケージを使用することができます。

あなたのコードでimport "foo/bar"を使用

、あなたは以下のとおりです。jnmlの答えについては詳しく説明し Declarations and scope

22

ソースファイル($GOPATH/src/foo/bar/にあります)を参照していません。

代わりに、コンパイル済みパッケージファイル$GOPATH/pkg/$GOOS_$GOARCH/foo/bar.aを参照しています。独自のコードを作成し、コンパイラがfoo/barパッケージがまだコンパイルされていない(または古くなっている)と判断すると、自動的にこれが実行されます。

$GOPATH/src/foo/barディレクトリにある関連するすべてのソースファイルを照合して、それらを単一のbar.aファイルに作成してpkgディレクトリにインストールします。コンパイルはあなた自身のプログラムで再開します。

このプロセスは、インポートされたすべてのパッケージとそれらによってインポートされたパッケージについて、依存関係チェインのすべての段階で繰り返されます。

*)どのようにファイルを照合するかは、ファイル自体の名前付け方法とその内部に存在するビルドタグの種類によって異なります。

この仕組みの詳細については、build docsを参照してください。

+0

ありがとう。これは本当に多くの疑念を明らかにしました。 – pymd

関連する問題