Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 可执行文件(“main”包)中的公共名称_Go_Private - Fatal编程技术网

Go 可执行文件(“main”包)中的公共名称

Go 可执行文件(“main”包)中的公共名称,go,private,Go,Private,据我所知,在导入包时,将导出(公共)大写的名称。但是,由于可执行文件(“main”包)是运行的,而不是由其他包导入的,所以名称是否为公共名称有什么区别?作为一个原则问题,我应该把所有的名字都保密吗?简单的回答是:没关系。可能在程序集级别上有一个公开的指针;但是,它还没有被说明 事实上,关于godoc和公函(大写)的评论是错误的。对于可执行文件(包主),godoc仅打印包的//头描述。它不会打印任何方法。我最近试过这个,想知道我所有的文档都在哪里 相反,人们对package main应用程序所做的

据我所知,在导入包时,将导出(公共)大写的名称。但是,由于可执行文件(“main”包)是运行的,而不是由其他包导入的,所以名称是否为公共名称有什么区别?作为一个原则问题,我应该把所有的名字都保密吗?

简单的回答是:没关系。可能在程序集级别上有一个公开的指针;但是,它还没有被说明

事实上,关于godoc和公函(大写)的评论是错误的。对于可执行文件(包主),
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中。这并不重要。