注意:我已经看到了与此主题相关的其他问题,但没有一个问题可以解决手头的问题。
我正在努力组织我的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
。我理解为什么,这似乎也不是一个好主意。
所以我在这里错过了一些简单的东西并使其变得更加复杂?
谢谢!
答案 0 :(得分:2)
我认为您可以在项目中使用一些常用方法,这是公平的假设。与分离服务器的方式相同,您应该使用常用方法分离包。尽管以某种逻辑方式思考和组织它可能更好,而不是调用包tools
,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中你包含了一个绝对路径的包,所以你可以在项目的任何地方保留你的“常见”东西,或者如果你认为它本身是有用的,只需发布一个单独的独立项目。