组织/构建Go包文件夹和文件的正确方法是什么?

时间:2015-09-16 22:56:11

标签: go

大家好,我知道这可能有争议或不是很广泛,但我会尝试非常具体,并与其他问题有关。

好的,当我制作一个Go程序时,我应该考虑如何组织我的项目? (例如,我应该认为我会有某种类型的控制器,所以我应该有一个控制器子目录,这样做我应该这样做)

我应该如何构建一个包?

例如我正在处理的当前程序我正在尝试使用this包来SteamBot

但是当我写它时,我不知道是否应该将某些方法导出到他们自己的文件中,例如我有类似

的东西
func (t *tradeBot) acceptTrade() {}
func (t *tradeBot) declineTrade() {}
func (t *tradeBot) monitorTrade() {}
func (t *tradeBot) sendTrade() {}

每个方法都会有相当多的代码,所以我应该将每个方法导出到自己的文件中,还是只有一个包含3000行代码的文件?

还使用全局变量,这样我就可以设置一个变量,然后保留它并能够在多个函数中使用它,或者这是不好的,我应该将变量作为参数传递?

我也应该订购我的文件:

package
imports
constants
variables
functions
methods

或者我只是把东西放在我需要的地方

希望我清楚自己,这不是一个可怕的问题。谢谢!

2 个答案:

答案 0 :(得分:4)

寻找灵感的第一个地方是Go standard library。 Go标准库是“好”Go代码应该是什么样的很好的指南。库与应用程序不完全相同,但它绝对是一个很好的介绍。

通常,您不会将每个方法分解为自己的文件。 Go倾向于选择覆盖主题的较大文件。但是3000线看起来相当大。即使net / http server.go也只有2200行,而且非常大。

全局可变变量在Go中与在任何语言中一样糟糕。由于Go非常依赖并发编程,因此全局可变变量非常可怕。不要那样做。一个常见的例外是sync结构,例如sync.Poolsync.Once,它们有时是包全局,但也可以同时访问。有时候还有“默认”版本的结构,比如http.DefaultClient,但你仍然可以将明确的版本传递给函数。再次,浏览Go标准库,看看什么是常见的,什么是罕见的。

答案 1 :(得分:1)

您希望找到一些有用的提示:

  • 按功能将代码组织到多个文件和包中,而不是按图层组织。这变得越重要,您的应用程序就越大。带有一个或两个控制器的软件包controllers可能没问题,但是将数百个不相关的控制器放在同一个软件包中没有任何意义。以下文章解释得非常好:http://www.javapractices.com/topic/TopicAction.do?Id=205

  • 全局变量有时会使代码更容易编写,但应谨慎使用。我认为记录器,调试标志等事情的未导出的全局变量都可以。