2013-08-20 29 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和应该清楚什么软件包以及它们是如何被使用的