习惯性的Go Code组织

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

我正在努力组织我的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.go放在那里,然后将其更改为包服务器.这里的问题是我似乎无法在主服务器和服务器包之间共享common.go.我理解为什么,它似乎也不是一个好主意.

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

谢谢!

最佳答案 我认为您可以在项目中使用一些常用方法,这是公平的假设.与分离服务器的方式相同,您应该使用常用方法分离包.尽管以某种合理的方式思考和组织它可能更好,而不是调用包工具,misc等.

我倾向于将东西分成包,所以它们可以在其他地方使用,而主包只是标记解析和调用库方法,例如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中你包含了一个绝对路径的包,所以你可以在项目的任何地方保留你的“常见”东西,或者如果你认为它本身是有用的,只需发布​​一个单独的独立项目.

点赞