golang项目目录结构

go语言和其他语言有一些区别,它是以包为单位来划分访问权限,和Java的访问粒度不一样,这注定了他们不会有相同的代码组织方式。

这里推荐的项目目录组织方式是按职责划分,采用这种结构的原因是,目前流行的开发模式是微服务架构,但是一般项目都是由小到大再到拆分的过程,如果项目初始就使用微服务的架构开发的话估计还没等项目开发完公司就完蛋了。 所以最开始还是单体架构才是正确的方式,不过为了以后方便拆分,可以对项目目录进行合理的划分。 从路由入口看:

func RouterRegister(router *gin.Engine) {
	//user路由注册
    	userRouter := router.Group("/user")
    	{
    		userRouter.GET("/index", user.Index)
    		userRouter.GET("/users/:id", middleware.Auth(), user.GetUserInfo)
    		userRouter.GET("/users-by-sql/:id", user.GetUserInfoBySql)
    		userRouter.POST("/", user.CreateUser)
    		userRouter.PUT("/update/:id", user.UpdateUser)
    		userRouter.DELETE("/del/:id", user.DeleteUser)
    	}
    	//user路由注册
    	postRouter := router.Group("/post")
    	{
    		postRouter.GET("/", post.Index)
    		postRouter.GET("/posts/:id", middleware.Auth(), post.GetPostInfo)
    		postRouter.GET("/posts-by-sql/:id", post.GetPostInfoBySql)
    		postRouter.POST("/", post.CreatePost)
    		postRouter.PUT("/:id", post.UpdatePost)
    		postRouter.DELETE("/:id", post.DeletePost)
    	}
}

本项目只是一个示例项目,模块较少,只开设了两个模块,userpost,注册路由的时候就可以按照不同的职责来分组注册,pkg目录下放置的就是不同职责的模块。 将来需要对服务进行拆分的时候只需要将pkg目录下的模块分离出去即可形成独立的服务,对依赖的的修改也较少。如果使用的MVC架构的话,要对不同职责的服务进行拆分则很困难,需要对每一层中对应的文件都拿出来重新组织。