Go 可执行文件(“main”包)中的公共名称
据我所知,在导入包时,将导出(公共)大写的名称。但是,由于可执行文件(“main”包)是运行的,而不是由其他包导入的,所以名称是否为公共名称有什么区别?作为一个原则问题,我应该把所有的名字都保密吗?简单的回答是:没关系。可能在程序集级别上有一个公开的指针;但是,它还没有被说明 事实上,关于godoc和公函(大写)的评论是错误的。对于可执行文件(包主),Go 可执行文件(“main”包)中的公共名称,go,private,Go,Private,据我所知,在导入包时,将导出(公共)大写的名称。但是,由于可执行文件(“main”包)是运行的,而不是由其他包导入的,所以名称是否为公共名称有什么区别?作为一个原则问题,我应该把所有的名字都保密吗?简单的回答是:没关系。可能在程序集级别上有一个公开的指针;但是,它还没有被说明 事实上,关于godoc和公函(大写)的评论是错误的。对于可执行文件(包主),godoc仅打印包的//头描述。它不会打印任何方法。我最近试过这个,想知道我所有的文档都在哪里 相反,人们对package main应用程序所做的
godoc
仅打印包的//头描述。它不会打印任何方法。我最近试过这个,想知道我所有的文档都在哪里
相反,人们对package main
应用程序所做的是将一个名为doc.go的文件添加到他们的包中。由于godoc规范允许您在任何文件中的任何位置装饰包主文件
,因此您可以在此处将所有文档写入此doc.go
文件,如下所示:
/* This executable serves a special purpose
and that is say Hello World when it is run.
A tip for writing comments in go is to use
line-break, text, line-break to make headers,
like this.
This Is A Header
And the sub-text to the header goes here.
Also note that you can create indented
code with 4 spaces...
Like this.
And this.
And the above will be printed as code
blocks in -html output.
*/
package main
请注意,上面的文本在文件末尾修饰了package main
。这就是这个doc.go项目中的所有文本
当您运行go doc.
时,它将读取此文件以获得输出
此外,当您运行主应用程序并使用-h或-help时,此文本也会呈现到控制台。尽可能详细地帮助用户
编辑:正如James提到的,是的,您可以导入其他主包。但这首先源自围棋的惯用性质。Go的文档甚至说,为了可读性,复制代码是完全可以的。这对我来说也很难接受,因为它来自.NET,使用的是枯燥的原则 虽然不常见,但可以从另一个包导入名为
main
的包。在GO工作区中考虑以下文件:
src/foo/foo.go
:
package main
import "fmt"
func Doit() {
fmt.Println("Doit() called")
}
func main() {
fmt.Println("Calling Doit from foo")
Doit()
}
package main
import (
"fmt"
foo "foo"
)
func main() {
fmt.Println("Calling Doit from bar")
foo.Doit()
}
src/bar/bar.go
:
package main
import "fmt"
func Doit() {
fmt.Println("Doit() called")
}
func main() {
fmt.Println("Calling Doit from foo")
Doit()
}
package main
import (
"fmt"
foo "foo"
)
func main() {
fmt.Println("Calling Doit from bar")
foo.Doit()
}
我可以正常构建这两个程序,bar
可以从bar
包调用导出的函数。如果它不出口,这是不可能的
这显然是一个人为的例子,但如果您有一组相关的程序要编译,它可能会很有用。显然,将共享代码拆分成一个单独的包(不命名为
main
会更干净。我倾向于将几个不同文件中使用的名称大写,如果它们只是本地感兴趣的话,则保留小写。我继续问,而Gopher Herder@LethalClips#4645
给了我一个合适的答案
通常,只有在需要库(如encoding/json
)从外部读取主包中的内容时,才会导出这些内容,因为您不希望手动导入主包
这个答案帮助我解决了这个问题。如果它被库访问,请将其导出。我认为这没什么区别。也许是为了戈多克?。Heka(mozilla)和Docker在他们的主包中使用未资本化的函数。你完全可以自由决定主包中的函数是否应该是公共的。请注意,只有主包中的公共函数才会显示在godoc中。这并不重要。