据我了解,导入包时会导出(公共)大写的名称。但是,由于可执行文件(" main"软件包)运行而不是由其他软件包导入,因此名称是否公开会有什么不同?作为一个原则问题,我应该将所有名称设为私有吗?
答案 0 :(得分:1)
简短的回答是:没关系。也许在装配级别上可能存在暴露的指针;但是,它没有说明。
实际上,关于godoc和公共(大写)字母的评论是错误的。对于可执行文件(包main),godoc
仅打印包的//标头描述。它不会打印任何方法。我最近尝试了这个,并且想知道我的所有文档都在哪里。
相反,人们为package main
个应用做的是将名为doc.go的文件添加到其包中。由于godoc规范允许您在任何文件中的任何位置装饰package main
,因此您可以在此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时,此文本也会呈现给控制台。尽可能精心设计,以帮助用户。
编辑:正如詹姆斯提到的,是的,你可以导入其他主要包。但是,这首先取决于Go的惯用性。 Go的文档甚至说,为了便于阅读,复制代码完全没问题。这对我来说很难吞下,来自.NET和使用DRY原则。
答案 1 :(得分:0)
虽然不常见,但可以从另一个包导入名为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()
}
src/bar/bar.go
:
package main
import (
"fmt"
foo "foo"
)
func main() {
fmt.Println("Calling Doit from bar")
foo.Doit()
}
我可以正常构建这两个程序,bar
可以从bar
包中调用导出的函数。如果它没有被导出,那么这是不可能的。
这显然是一个人为的例子,但如果您有一组想要编译的相关程序,它可能会很有用。显然,将共享代码拆分为一个名为main
的单独包中会更清晰。
答案 2 :(得分:0)
我倾向于将在多个不同文件中使用的名称大写,如果只在本地使用,则将它们小写。
答案 3 :(得分:0)
我在Discord Gophers上提问,而Gopher Herder @LethalClips#4645
为我找到了合适的答案。
通常,仅当您需要由
encoding/json
之类的库从外部读取内容时,才将其导出到主软件包中,因为您不想手动导入主软件包。
这个答案帮助我进行了梳理。如果它被图书馆访问,则将其导出。