一尘不染

包裹声明的目的是什么?

go

每个Go文件均以开头package <something>

据我了解-这可能是我缺少一些信息的地方-
仅有两个可能的值<something>:该目录的名称位于*或中main。如果为main,则该目录中的所有其他文件也只能具有main。如果还有其他问题,则说明该项目不一致/违反约定。

现在,如果它是目录的名称,那么它是多余的,因为相同的信息也包含在目录的名称中。

如果是main,则它是无用的,因为据我所知go build,没有办法告诉“请构建 所有 main软件包”。

*因为换句话说,一个目录就是一个包。


阅读 283

收藏
2020-07-02

共1个答案

一尘不染

软件包的名称不必与目录名称一致。可以package foobar在目录中xyz/go-foobar。在这种情况下,xyz/go-foobar成为
导入路径 ,但是用于质量标识符(功能,类型等)的 软件包名称 将是foobar

这是一个使它更具体的示例:我创建了一个测试包http://godoc.org/github.com/dmitris/go-
foobar(源于https://github.com/dmitris/go-
foobar)-您从文档页面可以看到,导入路径为“
github.com/dmitris/go-
foobar”,但包名称为foobar,因此您可以将其提供的函数称为foobar.Demo()(不是go-foobar.Demo())。

一个类似的真实示例-NSQ Messaging平台的导入路径为“ github.com/nsqio/go-nsq”,而程序包名称为“
nsq”:http
://godoc.org/github.com/nsqio/ go-nsq。但是,为了用户友好和简单起见,标准和推荐的做法是尽可能使导入路径的最后部分和程序包名称相同。

package main不是没有用的-它告诉Go编译器创建一个可执行文件,而不是.a库文件(带有go installgo get; go build会丢弃编译结果)。可执行package main文件以放置文件的目录名称命名。再举一个具体的例子-
我制作了一个测试程序https://github.com/dmitris/go-foobar-
client,将其安装在一起go get github.com/dmitris/go-foobar-client,您应该将go-foobar-client可执行文件放在$ GOPATH /
bin目录中。package mainGo编译器从放置文件的目录名称中获取可执行文件的名称。.go包含该main()功能的文件的文件名并不重要-
在上面的示例中,我们可以将其重命名main.goclient.go或其他内容,但是只要调用封闭目录go-foobar- client,就可以这样命名生成的可执行文件。

有关Go软件包的其他可访问且实用的阅读指南,我建议Dave Cheney的文章“建立Go项目的五个建议”
http://dave.cheney.net/2014/12/01/five-suggestions-for-
setting一个项目。

2020-07-02