习惯性的Go Code组织

时间:2015-04-21 17:05:43

标签: go

注意:我已经看到了与此主题相关的其他问题,但没有一个问题可以解决手头的问题。

我正在努力组织我的Go代码。我正在编写一个守护进程,我想在文件之间逻辑分割代码。

说我有3个文件,main.go

package main

func main() {
    GlobalFunc()

    commonFunc()

    var svr server.Server
    server.OtherFunc()
}

server.go

package main

type Server struct {
    name string
    ip string
}

func GlobalFunc() {

}

func (s *Server) OtherFunc() {
    commonFunc()
}

common.go

package main

func commonFunc() {

}

我希望能够将GlobalFunc()称为server.GlobalFunc(),以显示它是“服务器模块”的一部分。对于上面的例子,这似乎不可能。

我可以制作一个子网server,将server.go放在那里,然后将其更改为package server。这里的问题是我似乎无法在main和common.go包之间共享server。我理解为什么,这似乎也不是一个好主意。

所以我在这里错过了一些简单的东西并使其变得更加复杂?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您可以在项目中使用一些常用方法,这是公平的假设。与分离服务器的方式相同,您应该使用常用方法分离包。尽管以某种逻辑方式思考和组织它可能更好,而不是调用包toolsmisc等。

我倾向于将东西分成包,所以它们可以在其他地方使用,而主包只是标记解析和调用库方法,例如server.Run()。其他人喜欢将所有内容放入主项目中,如果您认为人们会将您的项目用作命令行工具而不是包,那么这可能是正确的。

我会考虑:

deamon/
    main.go
    server/server.go
    somelib/somelib.go -- to be included from main and server

如果您希望项目主要用作包,但仍包含一些命令行实用程序,您可以考虑:

deamon/
   deamon.go -- package deamon
   deamond/
       main.go -- you may include the top level package as anyone else

我们需要记住,在Go中你包含了一个绝对路径的包,所以你可以在项目的任何地方保留你的“常见”东西,或者如果你认为它本身是有用的,只需发布​​一个单独的独立项目。