go - 当编写一个包用作命令时,这是惯用的 : name all identifiers as private or name all identifiers as public?

标签 go private public idioms

在 Go 中,公共(public)名称以大写字母开头,私有(private)名称以小写字母开头。

我正在编写一个不是库的程序,它是一个单独的包。是否有任何 Go 习语规定我的标识符应该全部公开还是全部私有(private)?我不打算将这个包用作库或作为应该从另一个 Go 程序导入的东西。

我想不出我想要混合物的任何理由。它“感觉”好像完全私有(private)化是正确的选择。


我认为我没有得到任何具体的答案,但 Nate 最接近告诉我要考虑“导出与非导出”而不是“公共(public)和私有(private)”。

这让我相信不导出任何东西是最好的方法。在最坏的情况下,如果我最终从另一个包中的应用程序导入代码,我将不得不重新考虑应该导出什么,不应该导出什么。在我看来,这是一件好事。

最佳答案

如果您正试图调整您的思维方式以更符合 Go 的习惯,您应该停止将变量、函数和方法视为公共(public)或私有(private)。更准确的术语是导出或不导出。它肯定有更像 C 的感觉。

正如其他人所说,应用程序代码确实不需要导出。如果出于组织原因您决定将您的程序分解成包,您可以使用子包。在工作中,我们决定这样做。我们有:

projectgopath/src/projectname
                  projectname/subcomponent1
                  projectname/subcomponent2

到目前为止,我真的很喜欢这种结构。它有助于分离关注点,但不会达到在主项目之外制作包的程度。意图很明确。子包的预期用途仅用于此程序...

新的 go build 和 go install 命令似乎可以很好地处理它。我们将组件组合在包中,并仅通过导出公开必要的部分。

关于go - 当编写一个包用作命令时,这是惯用的 : name all identifiers as private or name all identifiers as public?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677297/

相关文章:

go - 指定 reflect.ValueOf 应该返回什么值

windows - 创建一个服务作为自动运行

php - (un)serialize() 的改变行为?

C++ 类成员初始化序列

去 : cors - Http Status 503 - No 'Access-Control-Allow-Origin' header is present on the requested resource

go - fmt.Println 不打印整个 float

javascript - 是否有任何模式可以提供 JS 中公共(public)静态、私有(private)和公共(public)方法以及变量的相似性?

java - 我怎样才能将我的私有(private)整数放入公共(public)整数中

c# - 为获取/设置私有(private)值创建单独的公共(public)函数有什么意义?

java - 错误: constructor Miclass in class Miclass cannot be applied to given types;