2017-08-19 36 views
-2

我一直在試圖找到這個問題的答案沒有成功。如何在多個源文件中解析導入語句?

這個問題是關於當一個包由多個源文件組成時,Go中的import語句。

比方說,我有一個名爲math包,其中包含多個文件:

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

讓我們假設math包利用了fmt包的,因此它需要相應的import語句。但由於我們有四個單獨的文件,我們必須將fmt包多次導入(至少對我的理解):

// add.go 
import "fmt" 

// subtract.go 
import "fmt" 

// divide.go 
import "fmt" 

// multiply.go 
import "fmt" 

現在的問題是,會發生什麼時,包被編譯?這些陳述是否合併在一起?

如果是這樣,爲什麼我們必須多次導入包(每個文件一次),而不是隻有一個包含所有導入語句的文件,以免重複自己?

回答

2

specification says

導入的包的包名稱的範圍是含有導入聲明的文件的文件塊。

因爲導入沒有包範圍,導入不會合並在一起,並且在使用導入的每個文件中都是必需的。

導入範圍與編譯器和鏈接器加載導入包的方式無關。這些工具足夠聰明,可以加載任何給定的軟件包一次。

+0

因此,當我四次導入'fmt'包時,編譯器如何確保它不會在同一個構建中連接四次包?我假設由於導入語句只有'文件範圍',編譯器必須以某種方式組合所有導入的庫,以避免兩次鏈接同一個庫。 – Rtsne42

+1

編譯器只構建一次任何包。如果你想知道它是怎麼做的,請閱讀編譯源代碼,它是[開源的,可在GitHub上獲得](https://github.com/golang/go)。 – Adrian

+0

@ Rtsne42標識符的範圍與編譯器和鏈接器加載包的方式無關。這些工具足夠聰明,可以加載任何給定的軟件包一次。 –

相關問題