2013-08-20 28 views
0

以下關於Go包的斷言是否準確?以下關於Go包的斷言是否準確?

  1. import "package_name"從所謂的程序包目錄中,如果在$ GOPATH,保存用戶去目錄,或在標準去安裝目錄樹中的一個變量發現進口的所有文件。

  2. package_name目錄中的文件通常會指定package package_name。但他們並不需要。實際上,import "package_name"也會導入包含行package foo的文件,如果在導入的package_name目錄中找到該文件。

  3. 被大寫所有功能將通過在封裝程序包聲明中給出的名稱來訪問 - 例如:

package_name.Function_in_file_that_declares_package_nameother_than_package_name.Function_in_file_that_declares_other_than_package_name

  1. 用戶定義的包是命令行go install -ed從包目錄內。但是,go會拒絕安裝一個與其內置包目錄名稱完全相同的目錄。例如你不能安裝一個字符串目錄,因爲已經有內建包「字符串」的字符串目錄。但是,用戶可以將函數追加到字符串包中,而無需更改內置字符串文件夾,方法是創建一個my_strings目錄並在其中放置一個指示package strings的文件。現在,import my_strings將加載用strings.Function_name訪問的額外用戶定義的字符串函數。

總之,import關鍵字用於從給定目錄加載文件。關鍵字package創建一個名稱空間來從該文件外部訪問大寫的函數。

我是否正確理解上述所有內容?

+0

看起來有點像你認爲Go包和import語句有點像C++中的include指令和namespace關鍵字(提示:他們沒有)。與C++相似,而是閱讀[spec](http://golang.org/ref/spec) – fuz

回答

4
  1. 「import」的參數是一個import_path,而不是包名。它使在$GOPATH/src/import_path中找到的包中的導出實體可用於出現「導入」子句的文件範圍中。

  2. 所有*。去的文件,除了*_test.go文件和文件// +build ignore,在一個單一的目錄必須說,package name條款或旅途中構建系統將拒絕它在相同的名稱。

  3. 未大寫,但屬於Unicode類別Lu。不是功能,而是任何TLD實體。

  4. 不,您可以使用其導入路徑從任何目錄安裝任何軟件包。是的,來自stdlib的軟件包具有優先權並且不能被「覆蓋」。但是,您可以使用例如「有效」替換stdlib軟件包。 import strings "github.com/foo/mystrings"。但是,效果僅限於本地/文件。

總之,no,導入用於使其他包中的實體可用於文件範圍。關鍵字「包」不會創建名稱空間。 「導入」的效果是文件範圍的,參見前面的句子,通常導入的實體通過限定名稱引用。該限定符是一種名稱空間,但請注意,不是「出口商」(package foo)控制它。相反,控制在「進口商」方面:import whatever_local_name "whatever_import_path"。但是,默認限定符是導入路徑的基本名稱。

「我們都同意嗎?」

根本不是。

+0

感謝您的更正 - 它們對您有所幫助。與我一起開始想知道是否可以將函數追加到字符串包中,而無需將文件添加到go src目錄。例如,我想要一個strings.transmutate函數。我想添加一個$ GOPATH/src/strings目錄,然後添加transmutate.go。但去不會允許我使用該文件夾名稱進行安裝。我也不想重載內置的字符串包,只是想添加到它。我的解決方案,似乎工作,是創建一個$ GOPATH/src/my_strings文件夾,並將transmutate.go放在裏面。 – Tim

+0

transmuate.go包含一個包字符串聲明。然後導入「my_strings」提供strings.transmutate功能。這是一個合理的解決方案? – Tim

+3

不,這不是一個合理的解決方案。包字符串是標準庫包之一。你不應該「添加」他們,並有你自己的'包字符串'讓你的代碼不可讀,現在突然'string.Trim'不再是stdlib的字符串修剪功能,但可能會刪除任意文件。請正確命名您的包裹,例如'package transmutate'和export'func Do(s string)string'或者類似的東西。 – Volker

4

即使聽起來很刺耳:幾乎所有的假設都是完全錯誤的。

看看http://golang.org/doc/effective_go.html#package-nameshttp://golang.org/ref/spec#Packages,並不認爲import是C的include的Go等價物。

Go的包更像是預編譯庫和import "some/path/foo"更像是foo.a鏈接(也使得出口實體可用下 - normaly - foo.SomethingExported

現在看看http://golang.org/doc/code.html和應該清楚什麼軟件包以及它們是如何被使用的