2017-08-19 16 views
-2

私は成功していないこの質問に対する答えを見つけることを試みてきました。インポートステートメントは、複数のソースファイルでどのように解決されますか?

質問は、パッケージが複数のソースファイルで構成されている場合のGoのインポートステートメントに関するものです。

はのは、私は複数のファイルで構成されていmathというパッケージがあるとしましょう:

|-- math 
    |-- add.go 
    |-- subtract.go 
    |-- divide.go 
    |-- multiply.go 

のは、mathパッケージは、したがって、それは適切なimport文を必要とfmtパッケージを利用していると仮定しよう。しかし、我々は4つの別々のファイルを持っているので、我々はfmtパッケージを複数回(少なくとも私の理解へ)をインポートする必要があります。

// add.go 
import "fmt" 

// subtract.go 
import "fmt" 

// divide.go 
import "fmt" 

// multiply.go 
import "fmt" 

を今の質問は、パッケージがコンパイルされたときに何が起こるか、ですか?ステートメントは単に一緒にマージされていますか?

もしそうならば、パッケージを何度も(ファイルごとに1回)インポートしなければならないのでしょうか?

答えて

2

specification says

インポートされたパッケージのパッケージ名の範囲がインポート宣言を含むファイルのファイルブロックです。

インポートにはパッケージスコープがないため、インポートは一緒にマージされず、インポートを使用する各ファイルで必要です。

インポートのスコープは、コンパイラとリンカーがインポートされたパッケージをロードする方法とは無関係です。これらのツールは、任意のパッケージを一度ロードするのに十分なほどスマートです。

+0

私は 'fmt'パッケージを4回インポートすると、コンパイラは同じビルドで4回パッケージをリンクしていないことをどのように確認しますか?インポートステートメントには 'ファイルスコープ'しかないので、コンパイラはインポートされたすべてのライブラリを結合して同じものを2回リンクしないようにしなければならないと思います。 – Rtsne42

+1

コンパイラはすべてのパッケージを一度しかビルドしません。 *どのように*それを行うか知りたければ、コンパイルのソースコードを読んでください。オープンソースで、GitHubで利用可能です(https://github.com/golang/go)。 – Adrian

+0

@ Rtsne42識別子のスコープは、コンパイラとリンカによるパッケージのロード方法とは無関係です。これらのツールは、任意のパッケージを一度ロードするのに十分なほどスマートです。 –

関連する問題